脚本桥和使用NSPredicate和FourCharCodes过滤SBElementArrays

Nic*_*son 4 cocoa itunes objective-c scripting-bridge

我是第一次尝试使用Scripting Bridge,但是遇到了SBElementArray根据包含FourCharCode枚举常量作为标准的NSPredicate 过滤a的问题.

我写了一个简单的程序来识别用户iTunes库中的"库"源,-filteredArrayUsingPredicate:用于过滤SBElementArray所有iTunes源.我期望得到一个SBElementArray,当评估时,会产生一个元素的数组,即库源.相反,当我调用-get返回时SBElementArray,我得到一个空数组.

令人困惑的,如果更改顺序,而是叫-getSBElementArray的所有来源得到一个具体的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);
Run Code Online (Sandbox Code Playgroud)

我得到的输出如下:

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)>"
)
Run Code Online (Sandbox Code Playgroud)

Nic*_*son 5

我想我已经明白了.看来你不能简单地直接在NSPredicate你打算用来过滤一个FourCharCode的整数值SBElementArray.

偶然的机会,我找到了而不是:

[NSPredicate predicateWithFormat:@"kind == %u", iTunesESrcLibrary]
Run Code Online (Sandbox Code Playgroud)

你需要使用:

[NSPredicate predicateWithFormat:@"kind == %@", [NSAppleEventDescriptor descriptorWithTypeCode: iTunesESrcLibrary]]
Run Code Online (Sandbox Code Playgroud)

使用第二种形式,我可以SBElementArray按预期过滤源列表.但是,这个新的谓词不能用于过滤NSArray,即使这个数组只是评估形式的SBElementArray!在这里,您必须切换回%u版本.

Rant:
坦率地说这太糟糕了,看起来Scripting Bridge应该处理的事情让我不必这样做; 我不应该知道它NSAppleEventDescriptor是什么.虽然合理的是并非所有与之NSArray合作的谓词都应该使用SBElementArray,但反过来情况并非如此,并且它不必要地混淆.