我第一次尝试使用 Scripting Bridge,但遇到了SBElementArray
根据包含 FourCharCode 枚举常量作为标准的 NSPredicate 过滤 a 的问题。
我编写了一个简单的程序来识别用户 iTunes 库中的“库”源,通过使用-filteredArrayUsingPredicate:
过滤SBElementArray
所有 iTunes 源。我期待得到一个SBElementArray
在评估时会产生一个元素的数组,即库源。相反,当我调用 return 时-get
,SBElementArray
我得到一个空数组。
令人困惑的是,如果更改顺序并调用所有源中-get
的SBElementArray
以获取具体的,并使用与以前相同的谓词NSArray
调用此数组,我确实得到了所需的结果。-filteredArrayUsingPredicate:
但是,我不认为这应该是必要的,并且我已经成功地SBElementArray
使用其他 NSPredicates 过滤了一个(例如@"name=='Library'"
工作正常)。
代码片段如下。iTunesESrcLibrary
是 Scripting Bridge 生成的头文件中定义的 FourCharCode 常量。( iTunesESrcLibrary = 'kLib'
)。我正在运行 10.6.5。
iTunesApplication* iTunes = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
NSPredicate* libraryPredicate = [NSPredicate predicateWithFormat:@"kind == %u", iTunesESrcLibrary];
SBElementArray* allSources_Attempt1 = [iTunes sources];
SBElementArray* allLibrarySources_Attempt1 = (SBElementArray*)[allSources_Attempt1 filteredArrayUsingPredicate:libraryPredicate];
NSLog(@"Attempt 1: %@", allLibrarySources_Attempt1);
NSLog(@"Attempt 1 (evaluated): %@", [allLibrarySources_Attempt1 get]);
NSArray* allSources_Attempt2 = [[iTunes sources] get];
NSArray* allLibrarySources_Attempt2 = [allSources_Attempt2 filteredArrayUsingPredicate:libraryPredicate];
NSLog(@"Attempt 2: %@", allLibrarySources_Attempt2);
我得到的输出如下:
Attempt 1: <SBElementArray @0x3091010: ITunesSource whose 'cmpd'{ 'relo':'= ', 'obj1':'obj '{ 'want':'prop', 'from':'exmn'($$), 'form':'prop', 'seld':'pKnd' }, 'obj2':1800169826 } of application "iTunes" (88827)>
Attempt 1 (evaluated): (
)
Attempt 2: (
"<ITunesSource @0x3091f10: ITunesSource id 65 of application \"iTunes\" (88827)>"
)