9

NSArray indexOfObjectPassingTestの使用に関するいくつかの例を見てきましたが、それらを機能させることができませんでした(有効なインデックスを返さない)。だから今、私はインラインブロックを使用しようとしています。ブロックをtypedefし、それをプロパティとして設定し、合成し、コンストラクターで初期化することで、これを実行しました。ただし、この種の方法では、メソッドを簡単に作成して代わりに使用できるため、ポイント全体がミュートになります(入力が少なくて済み、労力も少なくて済みます)。

私が達成しようとしているのは、これに沿った何かです。

Observations *obs = [self.myAppointment.OBSERVATIONS objectAtIndex: ^NSInteger (NSString *keyword){ 
    for (Observations *obs in self.myAppointment.OBSERVATIONS) {
        if ([obs.TIME isEqualToString:keyword] == YES) return (NSInteger)[self.myAppointment.OBSERVATIONS indexOfObject:obs];
    }
    return (NSInteger)-1;
}];

ただし、Xcodeにはそれがありません。さまざまなバリエーションを試しましたが、インラインで宣言するのは問題のようです。これは奇妙なことです。これは、前述のように、タイプ定義、宣言、および合成が次のように機能するためです。

Observations *obs = [self.myAppointment.OBSERVATIONS objectAtIndex:findObs(keyword)];

ここでも、findObsは、同じことを行う定義済みのブロックです。これは構文の問題ですか、それとももっと重要な何かが欠けていますか?

4

3 に答える 3

32

-objectAtIndex:パラメータとしてを受け取りNSUIntegerますが、ブロック ( で示されます) を渡しています^。2 番目の例findObsでは、引数を使用して (ブロックの可能性がある)を呼び出し、その呼び出しの結果keywordをに渡します。-objectAtIndex:

-objectAtIndex:おそらく以下と組み合わせたいでしょう-indexOfObjectPassingTest::

NSString *keyword = /* whatever */;
NSArray *array = self.myAppointment.OBSERVATIONS;
NSUInteger idx = [array indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    Observations *obs = (Observations*)obj;
    return [obs.TIME  isEqualToString:keyword];
}];
if (idx != NSNotFound)
    Observations *obs = [array objectAtIndex:idx];
于 2012-06-11T12:36:00.613 に答える
6
于 2015-01-20T05:56:37.230 に答える
3

2 番目の例を機能させるために型定義や合成を行う必要はありません。メソッドからブロックを返すだけで、次のようになります。

-(NSUInteger(^)(NSArray *, NSString *))findObs {
    return ^(NSArray *array, NSString *keyword) {
        for (NSUInteger i = 0; i < [array count]; i++) {
            Observations *obs = [array objectAtIndex:i];
            if ([obs.TIME isEqualToString:keyword]) {
                return i;
            }
        }
        return NSNotFound;
    };
}

Observations *obs = [self.myAppointment.OBSERVATIONS objectAtIndex:[self findObs](keyword)];

ブロックを inline ではなくメソッドの戻り値として定義する正当な理由を次に示します。

于 2012-06-11T18:04:42.667 に答える