0

我正在尝试在 Objective-C 中实现类似于 C# 委托概念的东西。我认为它可以完成,但我正在努力让它发挥作用。我已经为我的块设置了一个类型 def:

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 回答