'X' 类型的值没有成员 'y' - 协议中的可选函数

Rya*_*nJM 6 swift swift-protocols

我试图更好地理解 Swift 中的协议。特别是可选的协议方法。我认为这个问题可能与我在不同文件中定义/使用的协议有关,但是如果您将以下内容放在操场上,您会遇到同样的问题:

import Foundation

@objc protocol MyProtocol {
    optional func shouldJump() -> Bool
}

extension NSObject : MyProtocol {}

class Test {
    func testJump() {
        let object = NSObject()
        let jump = object.shouldJump?() ?? true

        print("should jump: \(jump)")
    }
}

let t = Test()
t.testJump()
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

error: value of type 'NSObject' has no member 'shouldJump'
            let jump = object.shouldJump?() ?? true
                       ^~~~~~ ~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它不接受已在 NSObject 上定义的协议。代码完成找到它,但编译器不让它通过。

我不确定我的?? true部分是否会起作用,但我希望它是默认值,以防未定义该方法。

我如何让这个工作?

Cos*_*syn 1

我认为这是因为编译器知道 NSObject 没有shouldJump方法,所以调用object.shouldJump?()没有意义。您可以转换object为您的协议:

let jump = (object as MyProtocol).shouldJump?() ?? true
Run Code Online (Sandbox Code Playgroud)