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

Ios 检查是否在Swift中实施了可选协议方法?,ios,swift,Ios,Swift,我有一个swift协议: @objc protocol SomeDelegate { optional func myFunction() } 我在我的一节课上做了: weak var delegate: SomeDelegate? 现在我想检查委托是否实现了myFunction 在objective-c中,我可以做到: if ([delegate respondsToSelector:@selector(myFunction)]) { ... } 但这在Swift中不可用 编辑

我有一个swift协议:

@objc protocol SomeDelegate {

  optional func myFunction()

}
我在我的一节课上做了:

weak var delegate: SomeDelegate?
现在我想检查
委托
是否实现了
myFunction

在objective-c中,我可以做到:

if ([delegate respondsToSelector:@selector(myFunction)]) { 
...
}
但这在Swift中不可用

编辑:这不同于:我关注类协议,而不是类

如何检查我的委托是否实现了可选方法?根据

您可以通过编写 调用需求时,在需求名称后加一个问号, 例如someOptionalMethod?(someArgument)。可选属性 要求,以及返回值的可选方法要求, 将始终返回一个适当类型的可选值 被访问或调用,以反映以下事实: 该要求可能尚未实施

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

您可以这样做

if delegate?.myFunction != nil {

}

我发现在协议中添加一个定义基本默认实现的扩展是成功的,然后实现该协议的任何类只需重写感兴趣的函数

    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协议的类都已经实现了所有功能,因此现在可以选择覆盖其功能。

声明

@objc public protocol nameOfDelegate: class {
    @objc optional func delegateMethod(_ varA: int, didSelect item: Item)
}
恳求

if let delegate = nameOfDelegate {
     delegate.delegateMethod?(1, didDeselect: node)
}

我通常是这样实现的:

self.delegate?.myFunction?()
如果委托方法返回一个值:

var result = defaultValue
if let delegateResult = self.delegate?.myFunction?() else {
  result = delegateResult
}

//do something with result

我知道这个问题已经问了5年了,但我想和大家分享我的发现。我的解决方案从2021年开始工作,XCode 11+,Swift 5

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

我必须看一下GIDSignIn模块的源代码,这就是为什么

单击导入的主模块上的跳转到定义。它将生成如下文件:

self.delegate?.myFunction?()

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

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

从这个文件中,我可以看到有一个sign函数是GIDSignInDelegate的存根,还有一个可选的sign函数是作为方法重载实现的


我在GIDSignInDelegate中使用了这个方法,但是您可以使用相同的方法来确定是否有任何函数遵循任何委托协议。

我想在调用它之前检查可选方法是否存在。那么您可能不想使用Swift。这不是语言所要支持的。您的实际使用案例是什么?@confile:查看“重复问题”的所有答案,例如:。它展示了如何首先测试委托是否实现了该方法,然后调用它。@Tommy虽然人们应该努力遵循约定,但在某些情况下,知道是否实际实现了可选方法可能会很方便。在我的例子中,可选方法的实现传递插件是否处理某个可选作业。如果你真的想知道两者的区别,你可能会有点困惑。你确定引用线程的这个或这个答案不能回答你的问题吗?现在不知道当问题被问到时,Swift的哪个版本是可用的,但在Swift 2.2中,你可以使用RespondsToSelector或重载方法呢?我们可以这样做来检查一个特定的函数吗?如果该函数不是可选的,这会使Xcode 7.3 Beta中的编译器崩溃。奇怪。这种方法会被调用两次,可能会导致一些意想不到的问题。如果我只在需要时才记得它,那么知道它非常有用:-)是的,但是如果某段代码需要在函数实现时才采取行动,那么这是如何工作的?如果由于协议的代码调用#选择器的某些部分而需要@objc,它将不会编译,因为它正在使用UI执行某些操作。六羟甲基三聚氰胺六甲醚。