【问题标题】:Checking for optional protocol methods in Swift gives error?检查 Swift 中的可选协议方法是否会出错?
【发布时间】:2023-03-23 03:29:01
【问题描述】:

在阅读有关可选协议要求的 Apple 文档后,它说您可以使用可选链来检查实现。我试过了,但我不断收到错误。似乎这不再是一种有效的方法,我正在尝试找出现在是否有新的方法可以做到这一点。

这是一个示例,因此您可以看到错误:http://swiftstub.com/743693493/
这是我的代码:

@objc protocol Bearable {
    func growl()
    optional func cough() -> String //Apparently bears cough when they are scared. 
}

@objc class Bear:Bearable {
    var name = "Black Bear"
    func growl() {
        println("Growllll!!!")
    }
}

@objc class Forest {
    var bear:Bear?
    func scareBears() {
        if let cough = bear?.cough?() {
            println(cough)      
        } else {
            println("bear was scared")  
        }
    }
}

我收到错误:error: 'Bear' does not have a member named 'cough' if let cough = bear?.cough?() {

【问题讨论】:

  • 如果你将bear定义为var bear: Bearable?就可以了
  • @MikeS 你完全正确。
  • @MikeS 你能把它写成答案让我选择吗?

标签: swift protocols optional


【解决方案1】:

您遇到的错误是有道理的,因为 Swift 可以在编译时知道 Bear 没有实现 cough()(而 Objective-C 不一定能够知道这一点)。

要编译您的代码,您需要使用Bearable 协议而不是Bear 类来定义bear

var bear: Bearable?

这可能是你想要的。否则,创建该协议没有多大意义。

【讨论】:

  • 优秀的答案谢谢!你是一个绅士和一个学者。
  • 没问题,很高兴能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多