繁体   English   中英

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

[英]Check if optional protocol method is implemented in Swift?

我有一个快速的协议:

@objc protocol SomeDelegate {

  optional func myFunction()

}

我上过一堂课:

weak var delegate: SomeDelegate?

现在我想检查delegate是否实现了myFunction

在objective-c我可以做:

if ([delegate respondsToSelector:@selector(myFunction)]) { 
...
}

但这在 Swift 中不可用。

编辑:这不同于: 什么是respondsToSelector的swift等价物? 我专注于课程协议而不是课程。

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

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

我通常是这样实现的:

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 模块的源代码,这就是方法。

在此处输入图片说明

在导入的主模块上单击跳转到定义。 它会导致一个这样的文件:

在此处输入图片说明

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

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

在此处输入图片说明

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

我将它用于 GIDSignInDelegate,但您可以使用相同的方法来确定是否有任何函数遵循任何委托协议。

宣言

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

暗示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM