4

Scripting Bridge を初めて試していますがSBElementArray、条件として FourCharCode 列挙定数を含む NSPredicate に従って a をフィルタリングする際に問題が発生しました。

すべての iTunes ソース-filteredArrayUsingPredicate:をフィルタリングするために使用して、ユーザーの iTunes ライブラリ内の「ライブラリ」ソースを識別する簡単なプログラムを作成しました。私は、評価されたときに、1 つの要素、つまりライブラリ ソースの配列を生成するSBElementArrayが返されることを期待していました。SBElementArray代わりに-get、返された を呼び出すとSBElementArray、空の配列が返されます。

困ったことに、順序を変更し、代わりにすべてのソース-getの を呼び出してSBElementArray具体的な を取得し、以前と同じ述語でこの配列をNSArray呼び出すと、目的の結果が得られます。-filteredArrayUsingPredicate:ただし、これが必要であるとは思いません。また、SBElementArray他の NSPredicates を使用してフィルタリングすることに成功しました (たとえば、正常に@"name=='Library'"動作します)。

コード スニペットを以下に示します。iTunesESrcLibraryScripting 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をフィルタリングするために使用する予定の で、FourCharCode の整​​数値を直接使用することはできないようですSBElementArray

偶然、代わりに次のことがわかりました。

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

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

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

この 2 番目のフォームを使用すると、SBElementArrayソース リストを期待どおりにフィルター処理できます。ただし、この新しい述語を使用して をフィルター処理することはできません。ただし、NSArrayこの配列はSBElementArray! %uここで、バージョンに戻す必要があります。

Rant:
率直に言って、これは最悪です。Scripting Bridge が対処すべきことのように思えるので、私が対処する必要はありません。an が何であるかを知る必要はありませんNSAppleEventDescriptor。で機能するすべての述語が で機能するわけではないことは合理的ですがNSArraySBElementArray逆は当てはまらず、そうであると不必要に混乱します。

于 2011-01-03T09:41:06.503 に答える