我为一个类
创建了一个委托@protocol gameDelegate <NSObject>
@optional
-(void)gameStarted;
@required
@end
现在在我的游戏对象中我调用了这个方法:
[self.delegate gameStarted];
现在,如果我在任何地方启动此对象并设置委托,一切正常,直到gameStated被调用,因为它没有在创建游戏对象的主对象中实现(因为它是可选的)。
我尝试了一些
的变体if(![self.delegate respondsToSelector: @selector(gameStarted)]) {
//[self.delegate gameStarted];
}
但这不适合我。 任何想法如何使这“真正”可选?
提前致谢
答案 0 :(得分:18)
忽略if
声明中的否定:
if ([self.delegate respondsToSelector:@selector(gameStarted)]) {
...
}
答案 1 :(得分:1)
要在swift中完成此操作,我建议如下:
@objc protocol MyDelegate {
optional func optionalMethod()
}
class MyClass : MyDelegate {
// optionalMethod() does not have to be declared
}
然后拨打optional
对象上的delegate
,简单地使用if delegate.optionalMethod?(){}
答案 2 :(得分:0)
检查委托是否实现了一个可选方法,然后调用它是一种常见的模式,我使用预处理器宏SAFE_CALL
来检查respondToSelector:
,然后调用该方法。
宏是:
#define SAFE_CALL(obj,method) \
([obj respondsToSelector:@selector(method)] ? [obj method] : nil)
它的用法如下:
SAFE_CALL(sourceDelegate, refresh)
// or
NSString *response = SAFE_CALL(object, responseValue)
请注意,此版本仅适用于没有参数的方法。
最初它是作为C函数实现的,但在使用ARC时会导致performSelector
泄漏的警告。作为预处理器宏,它完全按预期工作。