检查可选的协议方法是否在Swift中实现?
我有一个迅速的协议:
@objc protocol SomeDelegate { optional func myFunction() }
我是我的一个class级:
weak var delegate: SomeDelegate?
现在我想检查delegate
是否实现了myFunction
。
在Objective-C中,我可以这样做:
if ([delegate respondsToSelector:@selector(myFunction)]) { ... }
但是这在Swift中是不可用的。
编辑:这是不同的: 什么是swift相当于respondsToSelector? 我专注于类协议而不是类。
如何检查我的委托是否实现了可选的方法?
每个Swift编程语言:
通过在需求名称后面写一个问号(例如someOptionalMethod?(someArgument))来检查可选需求的实现。 可选属性需求和返回值的可选方法需求将在访问或调用时始终返回适当types的可选值,以反映可选需求可能尚未实现的事实。
所以意图不在于你检查方法是否被实现,而是你试图调用它,并得到一个可选的后面。
你可以做
if delegate?.myFunction != nil { }
我发现它成功地添加了一个扩展到定义基本的默认实现的协议,然后任何实现该协议的类只需要覆盖感兴趣的function。
public protocol PresenterDelegate : class { func presenterDidRefreshCompleteLayout(presenter: Presenter) func presenterShouldDoSomething(presenter: Presenter) -> Bool }
然后延长
extension PresenterDelegate { public func presenterDidRefreshCompleteLayout(presenter: Presenter) {} public func presenterShouldDoSomething(presenter: Presenter) -> Bool { return true } }
现在任何需要遵守PresenterDelegate协议的类都已经实现了所有的function,所以现在可以覆盖它的function。