我有一个快速的协议:
@objc protocol SomeDelegate {
optional func myFunction()
}
我参加了我的一个课程:
weak var delegate: SomeDelegate?
现在我想检查delegate
是否已myFunction
已实施。
在objective-c中,我可以这样做:
if ([delegate respondsToSelector:@selector(myFunction)]) {
...
}
但这在Swift中不可用。
编辑:这与以下内容不同:What is the swift equivalent of respondsToSelector?我专注于不在类上的类协议。
如何检查我的代理是否已实施可选方法?
答案 0 :(得分:27)
每The Swift Programming Language:
通过编写检查可选要求的实现 调用要求名称后面的问号, 比如someOptionalMethod?(someArgument)。可选属性 要求,以及返回值的可选方法要求, 将始终返回适当类型的可选值 被访问或调用,以反映可选的事实 要求可能尚未实施。
因此,目的并不是要检查方法是否已实施,而是尝试调用该方法,并获得可选的方法。
答案 1 :(得分:15)
你可以做到
if delegate?.myFunction != nil {
}
答案 2 :(得分:8)
我发现成功添加了定义基本默认实现的协议的扩展,然后实现协议的任何类只需覆盖感兴趣的函数。
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协议的类都已经实现了所有功能,所以它现在可选来覆盖它的功能。
答案 3 :(得分:1)
我知道这个问题已有 5 年历史,但我想分享我的发现。我的解决方案适用于 2021 年,XCode 11+,Swift 5。
假设我想弄清楚函数符号是否遵循 GIDSignInDelegate 协议,还想知道 GIDSignInDelegate 的所有可选函数是什么。
我必须查看 GIDSignIn 模块的源代码,这就是方法。
点击跳转到导入的主模块的定义。它将导致这样的文件:
复制整行,导入 GoogleSignIn.GIDSignIn 并将其粘贴到 ViewController 或任何 .swift 文件中(并不重要)。
在 swift 文件中,右键单击导入行 GoogleSignIn.GIDSignIn 的 GIDSignIn 部分并跳转到定义。这将引导您进入具有所有可用功能的实际模块(未标记为可选的功能可能是存根,它们是委托协议中的必需功能):
从这个文件中,我可以看到有一个作为 GIDSignInDelegate 存根的符号函数和一个作为方法重载实现的可选符号函数。
我将它用于 GIDSignInDelegate,但您可以使用相同的方法来确定任何函数是否遵循任何委托协议。
答案 4 :(得分:0)
声明
loadData(){
this.loadDataService.getLazyFiles(
this.URL,
(response:any) => {
this.config.nodes = response.map((elem) => <TreeNode>{
label : `${elem.title}_MyValue`,
data: elem.id,
"expandedIcon": "fa fa-folder-open",
"collapsedIcon": "fa fa-folder",
leaf:false,
type:"1",
});
}, (error) => {
console.log(error);
});
}
牵连
@objc public protocol nameOfDelegate: class {
@objc optional func delegateMethod(_ varA: int, didSelect item: Item)
}
答案 5 :(得分:0)
我通常是这样实现的:
self.delegate?.myFunction?()
如果委托方法返回值:
var result = defaultValue
if let delegateResult = self.delegate?.myFunction?() else {
result = delegateResult
}
//do something with result