私は初めてScripting Bridgeを試していますが、FourCharCode列挙定数を基準にしてNSPredicateに従ってSBElementArray
をフィルタリングして問題に遭遇しました。NSPredicateとFourCharCodesを使用してSBElementArraysをフィルタリングする
すべてのiTunesソースのうちSBElementArray
をフィルタリングするために-filteredArrayUsingPredicate:
を使用して、ユーザーのiTunesライブラリの「ライブラリ」ソースを識別する簡単なプログラムを作成しました。私はSBElementArray
を返すことを期待していました。評価すると、1つの要素、つまりライブラリソースの配列が生成されます。代わりに、返されたSBElementArray
に-get
を呼び出すと、空の配列が返されます。
はPerplexingly、順序を変更し、代わりに、具体的なNSArray
を取得し、前と同じ述語でこの配列に-filteredArrayUsingPredicate:
を呼び出すために、すべてのソースのSBElementArray
に-get
を呼び出す場合、私は望ましい結果を得ますか。しかし、これは必要であるとは思われません。他の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)>"
)
私はあなたの痛みを感じます。私はScripting Bridgeを掘り下げて、たくさんの社内制作作業をしています。SBを使いやすくするために、いくつかのラッパークラスを用意しなければなりませんでした。この作業は、Cocoaの統合だけでは価値がありますが、開始するには多くの作業が必要です。 –