检查是否在Swift中实现了可选的协议方法?

时间:2015-05-22 14:02:47

标签: ios swift

我有一个快速的协议:

@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?我专注于不在类上的类协议。

如何检查我的代理是否已实施可选方法?

6 个答案:

答案 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。

enter image description here

假设我想弄清楚函数符号是否遵循 GIDSignInDelegate 协议,还想知道 GIDSignInDelegate 的所有可选函数是什么。

我必须查看 GIDSignIn 模块的源代码,这就是方法。

enter image description here

点击跳转到导入的主模块的定义。它将导致这样的文件:

enter image description here

复制整行,导入 GoogleSignIn.GIDSignIn 并将其粘贴到 ViewController 或任何 .swift 文件中(并不重要)。

在 swift 文件中,右键单击导入行 GoogleSignIn.GIDSignIn 的 GIDSignIn 部分并跳转到定​​义。这将引导您进入具有所有可用功能的实际模块(未标记为可选的功能可能是存根,它们是委托协议中的必需功能):

enter image description here

从这个文件中,我可以看到有一个作为 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