Изменение типов аргументов в обратном вызове блока - PullRequest
3 голосов
/ 01 февраля 2012

Недавно я видел пример кода в видео WWDC от инженера Apple. Он использовал 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 может использоваться для представления любого типа target-c, но этот маленький трюк с аргументами был мне неизвестен.

Есть ли документация для этой функции языка? Можно ли это использовать в обычных методах, где у вас тоже есть аргумент (id)sender? Это даже безопасно или полностью поддерживается?

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Вот ссылка на apple doc типа id. Этот прием можно использовать в любом методе, отправляющем идентификатор, и он безопасен, если вы уверены в типе или проверьте его перед использованием.

0 голосов
/ 18 февраля 2012

В значительной степени равно:

[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) {
    // ...
}

Нет ссылок на документы, извините!

...