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

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

令人困惑的是,如果更改顺序,而是在所有源的 -get 上调用 SBElementArray 以获得具体的 NSArray ,并使用与以前相同的谓词在此数组上调用 -filteredArrayUsingPredicate: ,我确实得到了所需的结果。但是,我认为这不是必需的,并且我已经成功地使用其他 NSPredicate 过滤了 SBElementArray(例如 @"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)>"
)

最佳答案

我想我已经想通了。似乎您不能简单地在您打算用来过滤 NSPredicateSBElementArray 中直接使用 FourCharCode 的整数值。

偶然地,我发现,而不是:

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

你需要使用:
[NSPredicate predicateWithFormat:@"kind == %@", [NSAppleEventDescriptor descriptorWithTypeCode: iTunesESrcLibrary]]

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

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

关于objective-c - 使用 NSPredicate 和 FourCharCodes 编写桥接脚本和过滤 SBElementArrays,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4582263/

10-09 16:04