2011-01-03 6 views
4

私は初めて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)>" 
) 

答えて

5

私はそれを考え出したと思います。 SBElementArrayをフィルタリングするのに使用するNSPredicateにFourCharCodeの整数値をそのまま使用することはできないようです。

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

この二番目の形式を使用して予想通り、私はSBElementArrayソースリストをフィルタリングすることができます

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

あなたが使用する必要があります。

は偶然、私が代わりにことがわかりました。ただし、この配列はSBElementArrayの評価済みフォームであっても、この新しい述語をNSArrayのフィルタに使用することはできません。ここでは、%uバージョンに戻る必要があります。

Rant:
これはうんざりだし、Scripting Bridgeが対処すべきものだと思われるので、私はそうする必要はありません。私はNSAppleEventDescriptorが何であるか知る必要はありません。 NSArrayで動作するすべての述語がSBElementArrayで動作するわけではないのは妥当ですが、逆の場合はそうではなく、不必要に混乱します。

+0

私はあなたの痛みを感じます。私はScripting Bridgeを掘り下げて、たくさんの社内制作作業をしています。SBを使いやすくするために、いくつかのラッパークラスを用意しなければなりませんでした。この作業は、Cocoaの統合だけでは価値がありますが、開始するには多くの作業が必要です。 –