1

ブロックパラメータの理由について誰かが洞察を持っていますか

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

stop返す代わりに参照渡ししますか?

戻り値を使用できることは「明らか」に思えますが、これはおそらく何かが欠けていることを意味し、何が欠けているのか知りたいと思っています。(私が考えることができる唯一のことは、参照渡し変数に名前を付けて、その意味を明確にすることができるということです。)

4

1 に答える 1

2

私の推測では、このstop機能は必ずしも必要ではなく、ブロックを return にvoidすることで構文が軽く保たれるためです。

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

それよりも:

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

また、ご指摘のとおり、明快さの問題もあります。ドキュメントを確認しないと、ここでの列挙の戻り値が何を意味するかを判断するのは困難です。(また、ブロックの戻り値について言えば: Where's my -[NSArray collectResultsUsingBlock:]method?)

追加されたマイナーな要因は、BOOLタイプがブロックタイプの推論でうまく機能しなかったことかもしれません。

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

次のいずれかを行う必要がある型エラーがスローされます。

return (BOOL)YES;

また:

usingBlock:^BOOL (NSTextCheckingResult…

すべてがうまくいくように。

これはすべて、ランクの推測にすぎません。ドキュメントはこの問題について沈黙しているようです。Cocoaのコーディング ガイドラインは、プロトタイプ宣言で常にブロック引数の名前を提供するなど、Apple が内部的に採用したと思われる標準化の取り組みを含むように更新されていないようです。

于 2013-08-10T00:51:10.170 に答える