我正在尝试在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不允许这样做。
有人知道如何解决这个问题吗?
答案 0 :(得分:4)
您的问题是您的compareBlock
属性是一个块,而isGreaterThan
是一个函数指针。这些不可互换。你想要的是这样做:
self.compareBlock = ^(id lhs, id rhs){
/* compare here */
return (BOOL)comparisonResult;
};
Blocks允许您在方法体中而不是在命名函数中声明比较器。如果你想真正使用你的isGreaterThan
函数,你只需将它包装在一个块中,因此:
self.compareBlock = ^(id lhs, id rhs){
return isGreaterThan(lhs,rhs);
};
答案 1 :(得分: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;
}