1

Кто-нибудь есть некоторое представление о том, почему параметр блокаПочему этот метод передает «стоп» по ссылке вместо возврата?

- (void)enumerateMatchesInString:(NSString *)string 
         options:(NSMatchingOptions)options 
          range:(NSRange)range 
         usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block 

stop проходит по ссылке, а не возвращать его?

Мне кажется «очевидным», что вы можете использовать возвращаемое значение для того, что провально означает, что я чего-то не хватает, и я хотел бы знать, чего я не вижу. (Единственное, что я могу придумать, это то, что вы можете указать имя для переходов по ссылочным переменным, чтобы сделать их смысл более ясным.)

+1

Честно говоря, я не вижу в этом каких-либо особых причин. Возможно, это просто более очевидно, поэтому это может повысить удобочитаемость. –

+0

да ... Я только что редактировал это в скобках. Это все, о чем я могу думать. – griotspeak

ответ

2

Я предполагаю, что функциональность stop не обязательно необходима, и создание блока вернуться void сохраняет синтаксис легче, потому что вы можете просто упасть в конце кода возврата:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
    NSLog(@"result: %@", result); 
}]; 

вместо:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags) { 
    NSLog(@"result: %@", result); 
    return YES; 
}]; 

Кроме того, как вы отмечаете, есть вопрос ясность. Не проверяя документы, было бы трудно сказать, что означает возвращаемое значение для перечисления здесь. (Кроме того, говоря о возвращаемых значениях блока: Где мой -[NSArray collectResultsUsingBlock:] метод?)

Добавленных второстепенный фактор может быть, что BOOL типов так хорошо не играли с умозаключением типа блока довольно долгое время, так что это:

usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags) { 
    return YES; 
}]; 

бы бросить ошибку типа требуя, чтобы сделать что-либо:

return (BOOL)YES; 

или:

usingBlock:^BOOL (NSTextCheckingResult… 

, чтобы все было правильно.

Все это просто спекуляция в ранге. Документация, похоже, не согласна с этим вопросом; Coding Guidelines for Cocoa, похоже, не были обновлены, чтобы включить даже усилия по стандартизации, которые Apple, по-видимому, приняла внутренне, например, всегда предоставляя имена для аргументов блока в объявлениях прототипов.

Смежные вопросы