4

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

我编写了一个简单的程序来识别用户 iTunes 库中的“库”源,通过使用-filteredArrayUsingPredicate:过滤SBElementArray所有 iTunes 源。我期待得到一个SBElementArray在评估时会产生一个元素的数组,即库源。相反,当我调用 return 时-getSBElementArray我得到一个空数组。

令人困惑的是,如果更改顺序并调用所有源中-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);

我得到的输出如下:

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)>"
)
4

1 回答 1

5

我想我已经想通了。看来您不能直接在NSPredicate您打算用来过滤SBElementArray.

偶然地,我发现不是:

[NSPredicate predicateWithFormat:@"kind == %u", iTunesESrcLibrary]

你需要使用:

[NSPredicate predicateWithFormat:@"kind == %@", [NSAppleEventDescriptor descriptorWithTypeCode: iTunesESrcLibrary]]

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

Rant:
坦率地说,这很糟糕,而且似乎 Scripting Bridge 应该处理这种事情,所以我不必这样做;我不应该知道 anNSAppleEventDescriptor是什么。虽然并非所有与 一起使用的谓词都NSArray应该与 一起使用是合理的SBElementArray,但反过来不应该是这种情况,而且它是不必要的混淆。

于 2011-01-03T09:41:06.503 回答