学習 (実用的ではありませんが、まだ) の目的で、NSDictionary で次のメソッドを使用して、定義したテストを使用して値を持つキーのセットを返したいと思います。残念ながら、述語を指定する方法がわかりません。
NSDictionary keysOfEntriesPassingTest:
- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate
たとえば、私のすべての値が NSURL であり、ポート 8080 にあるすべての URL を取得したいとしましょう。これがコーディングの私の刺し傷です。正しい:
NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
return key;
}]
これは、次のコンパイラ エラーが返されるためです。
'void (^)(struct objc_object *, struct objc_object *, BOOL *)' を初期化する互換性のないブロック ポインター型、予期される 'BOOL (^)(struct objc_object *, struct objc_object *, BOOL *)'
私は何が欠けていますか?述語が想定されて
いる「ブロックオブジェクト」について詳しく説明しているドキュメントへのポインタをいただければ幸いです。
ありがとう!
そして、これは機能するコードです:
NSSet *mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
{
if ([[obj port] isEqual:[NSNumber numberWithInt: 8080]])
return YES;
else
return NO;
}];