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

con*_*ile 30 ios swift

我有一个快速的协议:

@objc protocol SomeDelegate {

  optional func myFunction()

}
Run Code Online (Sandbox Code Playgroud)

我做了我的一个课程:

weak var delegate: SomeDelegate?
Run Code Online (Sandbox Code Playgroud)

现在,我要检查是否delegate已经myFunction实现.

在objective-c中,我可以这样做:

if ([delegate respondsToSelector:@selector(myFunction)]) { 
...
}
Run Code Online (Sandbox Code Playgroud)

但这在Swift中不可用.

编辑:这与以下内容不同:respontsToSelector的快速等价物是什么?我专注于不在类上的类协议.

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

Tom*_*mmy 29

Per Swift编程语言:

您可以通过在调用需求名称后面写一个问号来检查可选需求的实现,例如someOptionalMethod?(someArgument).可选属性要求和返回值的可选方法要求在访问或调用时始终返回适当类型的可选值,以反映可选要求可能尚未实现的事实.

因此,目的不是要检查方法是否已实现,而是尝试无论如何调用它并获得可选的返回方法.

  • 那么你可能不想使用Swift.这不是语言的支持.你的实际用例是什么? (3认同)
  • 我想在调用之前检查可选方法是否存在。 (2认同)
  • @confile:查看"重复问题"的*all*答案,例如:http://stackoverflow.com/a/27665147/1187415.它显示了如果委托实现该方法,然后调用它,如何首先进行测试. (2认同)
  • 如果可选方法返回可选类型。如果你真的想知道其中的区别,你可能会有点困惑。 (2认同)

new*_*cct 15

你可以做

if delegate?.myFunction != nil {

}
Run Code Online (Sandbox Code Playgroud)

  • 那个重载方法怎么样?我们可以这样做来检查特定的一个吗? (2认同)

Chr*_*ris 8

我发现成功添加了定义基本默认实现的协议的扩展,然后任何实现协议的类只需要覆盖感兴趣的函数.

    public protocol PresenterDelegate : class {
        func presenterDidRefreshCompleteLayout(presenter: Presenter)
        func presenterShouldDoSomething(presenter: Presenter) -> Bool
    }
Run Code Online (Sandbox Code Playgroud)

然后延长

    extension PresenterDelegate {
        public func presenterDidRefreshCompleteLayout(presenter: Presenter) {}
        public func presenterShouldDoSomething(presenter: Presenter) -> Bool {
        return true
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在任何需要符合PresenterDelegate协议的类都已经实现了所有功能,因此现在可以选择覆盖它的功能.