我第一次尝试使用 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)>"
)
最佳答案
我想我已经想通了。似乎您不能简单地在您打算用来过滤 NSPredicate
的 SBElementArray
中直接使用 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/