最近AppleのエンジニアのWWDCビデオでいくつかのサンプルコードを見ました。彼はNSArray
のメソッドenumerateObjectsUsingBlock:
を使っていましたが、ブロックの最初の引数はid
ではなく、開発者が知っていた具体的な型に変更されていました。ブロックコールバックの引数型を変更する
例えば、私はXcodeでこれに行くを与え、すべてが正常に動作します:
NSArray *test = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
[test enumerateObjectsUsingBlock:^(NSString *aString, NSUInteger idx, BOOL *stop) {
// ...
}];
enumerateObjectsUsingBlock:
ための宣言が型id
であることが第一のブロックの引数を宣言しています。今
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block
私はid
がどのような目的のC型を表現するのにも使えると理解していますが、引数を使ったこの小さなトリックはわかりませんでした。
言語のこの機能に関するドキュメントはありますか?これはあなたも(id)sender
引数を持っている通常の方法で使用できますか?これは安全か完全にサポートされていますか?
私の意見では、それは少なくともあなたに警告を与えるべきです。 APIはオブジェクト型を与えることができますが、宣言は文字列のみを受け入れるということです。 – JeremyP
私はあなたが想像することができるすべての警告でこれを実際にテストし、すべてがOKと報告されました。 –
私はコンパイラのバグでなければならないと思いますが、今度は 'for(... in ...)'制御文を反映しています。 – JeremyP