我正在通过现代化我过去编写的代码来设计一个新的应用程序。这段旧代码使用类/委托(delegate)模型,我正在尝试将它们转换为使用 block 作为回调,而不是委托(delegate)的东西。
我所做的是创建一个类似的属性
@property (nonatomic, copy) void (^onTouch)(NSInteger index);
这将向使用该类的对象传递一个 block ,代码可以插入其中,在这种情况下,在触摸时执行。
但我的问题是这样的。当您使用委托(delegate)并且您在委托(delegate)协议(protocol)上有一个方法时,如果您使用该类而忘记实现委托(delegate)协议(protocol),Xcode 将发出警告。那是用 block 做的方法吗?或者换句话说:如果调用者未定义回调 block ,是否有办法让 Xcode 提示?
我的意思是这是正确的:
MyClass *obj = [[MyClass alloc] init];
obj.onTouch = ^(NSInteger *index){ //call back code to be executed };
这样也行
MyClass *obj = [[MyClass alloc] init];
obj.onTouch = nil;
但这会生成一条消息
MyClass *obj = [[MyClass alloc] init];
// no callback block defined.
这可能吗?
最佳答案
如果你想强制设置某个参数,我会将其包含在初始化程序中。
MyClass *obj = [[MyClass alloc] initWithBlock:^(NSInteger *index) { /* code*/ }];
然后,在 MyClass
中:
- (id)init {
// This will result in a runtime error if you use the wrong initializer.
NSAssert(NO, @"Use initWithBlock instead.");
}
- (id)initWithBlock(initWithBlock:^(NSInteger *)block) {
self = [super init];
if (self) {
self.onTouch = block;
}
return self;
}
另请注意,尝试执行 NULL
block 会导致崩溃,因此请务必执行以下操作:
if (self.onTouch) { self.onTouch(); }
无论你在哪里运行 block 。
关于iphone - 让 Xcode 提示缺少参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18946342/