0

Objective-C で C# デリゲートの概念に似たものを実装しようとしています。私はそれができると思っていましたが、それを機能させるのに苦労しています。ブロックの型定義を設定しました。

typedef BOOL (^CompareBlock)(id obj1, id obj2);

ブロックのクラスのプロパティもあります。

@property (nonatomic, copy) CompareBlock compareBlock;

私がやりたいことはinit、既存のメソッドへの参照を使用してメソッドにプロパティを設定することです:

BOOL isGreaterThan(id obj1, id obj2)
{
     // perform some comparison

     return false;
}

- (id)init
{
    self = [super init];

    if (self)
        self.compareBlock = isGreaterThan;

    return self;
}

これが正しい構文ではないことはわかっていますが、この概念をどのように実現できるかわかりません。定義したブロック typedef に関数をキャストしようとしましたが、ARC では許可されていないというエラーが表示されます。

この問題を解決する方法を知っている人はいますか?

4

2 に答える 2

4

あなたの問題は、compareBlockプロパティがブロックでありisGreaterThan、関数ポインターであることです。これらはこのように交換可能ではありません。あなたがしたいのは、これを行うことです:

self.compareBlock = ^(id lhs, id rhs){ 
    /* compare here */
    return (BOOL)comparisonResult;
};

ブロックを使用すると、名前付き関数ではなく、メソッドの本体でコンパレータを記述できます。関数を実際に使用したい場合isGreaterThanは、ブロックでラップするだけです。

self.compareBlock = ^(id lhs, id rhs){ 
    return isGreaterThan(lhs,rhs);
};
于 2013-01-24T01:16:31.767 に答える
0

iluvcapraが提案したことを使用して、私がやろうとしていたことを達成する方法を見つけました。私が以前のように物事を行おうとしていた主な理由は、きちんとするためです。この方法はそれを達成すると思います:

+ (CompareBlock) isGreaterThan
{
     return ^(id object1, id object2)
     {
         // perform some comparison

         return compareResult;
     }
}

- (id)init
{
    self = [super init];

    if (self)
        self.compareBlock = [MyClass isGreaterThan];

    return self;
}
于 2013-01-24T02:17:07.223 に答える