2012-02-01 10 views
3

最近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引数を持っている通常の方法で使用できますか?これは安全か完全にサポートされていますか?

+0

私の意見では、それは少なくともあなたに警告を与えるべきです。 APIはオブジェクト型を与えることができますが、宣言は文字列のみを受け入れるということです。 – JeremyP

+0

私はあなたが想像することができるすべての警告でこれを実際にテストし、すべてがOKと報告されました。 –

+0

私はコンパイラのバグでなければならないと思いますが、今度は 'for(... in ...)'制御文を反映しています。 – JeremyP

答えて

1

ここにはlink to apple docidタイプがあります。 このトリックはIDを送信するすべてのメソッドで使用でき、のタイプについてはであるか、使用する前にチェックしてください。

にほとんど等しい
0

[test enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    NSString *aString = (NSString*)obj; 
    // ... 
}]; 

ループの高速列挙に明確なパラレルがあることに注意してください:対

for (id obj in test) { 
    NSString *aString = (NSString*)obj; 
    // ... 
} 

for (NSString *aString in test) { 
    // ... 
} 

へのリンクはありませんdocs、しかし - 申し訳ありません!

関連する問題