どのように私はNSDictionaryののkeysOfEntriesPassingTestで必要とされるブロックオブジェクト/述語を指定するのですか?
-
27-09-2019 - |
質問
(実用的ではない - まだ)学習のための目的を、私は私を与えることをNSDictionaryの上で次のメソッドを使用したいのは、私が定義したテストを使用して値を持つキーのセットをバックします。残念ながら、どのように述語を指定するには考えている。
NSDictionary keysOfEntriesPassingTest:
- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate
例えばましょうと言う私のすべての値がNSURLsであり、私はここにコーディングでの私の刺しだポート8080上にあるすべてのURLを取り戻すしたいこと - それは本当に私には意味がありませんが、それそれ「正しいをd:
NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
return key;
}]
そして、それの私は、次のコンパイラエラーを取り戻すために:
初期化互換性のないブロックポインタタイプ '(^)ボイド(構造体objc_object *、構造体objc_object *、BOOL *)'
'BOOL(^)(構造体objc_object *、構造体objc_object *、BOOL *)' 期待
私は何をしないのですか?私は<私>述語をすることになっていることを「Blockオブジェクト」についての詳細に入るいくつかのドキュメントでポインタをいただければと思います。
ありがとう!
これは動作するコードです。
NSSet *mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
{
if ([[obj port] isEqual:[NSNumber numberWithInt: 8080]])
return YES;
else
return NO;
}];
解決
エラーがあなたのブロックではなくBOOL
より、id
を返す必要があることを示しています。ドキュメントを確認してください。私はあなたがキー/ OBJペアが所望の試験に合格した場合YES
を返すことが期待されている疑います。
他のヒント
バリーの答えに少し拡大....
ブロックは一つの重要な違いを有する関数ポインタのようなものです。ブロックは、return文から戻り値の型は、の中に含まれる推測されますかのそれはあなたが(LLVMコンパイラのエラーは、もう少し合理的でなければなりません)とのようなエラーメッセージが表示されます。
あなたが書いたときます:
NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
return key;
}]
関数としてのことを考えてみます:
BOOL bob(id key, id obj) {
if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
return key;
}
}
問題を参照してください?コンパイラは文句を言うでしょう、したがって、値を返すとしないコードパスがあります。