Swift可选协议行为不一致

时间:2016-11-06 07:11:08

标签: ios swift3 xcode8

来自.Net,我正在尝试学习Swift3 / iOS,并对以下明显不一致的可选协议成员行为感到困惑。我怀疑它与objc / swift之间的杂耍有关,但实际上我在这里错过了什么?

// In playground, given below:

@objc protocol SomePtotocol {
    @objc optional func someMethod()
}

class SomeDelegate: NSObject, SomePtotocol {
}

class SomeController: NSObject {
    var delegate: SomePtotocol = SomeDelegate()
}

// This works and compiles without error

let controller = SomeController()
controller.delegate.someMethod?()      // No error, typed as '(() -> ())?'

// But this fails to even compile ??

let delegate = SomeDelegate()
delegate.someMethod?()  // Error: 'SomeDelegate' has no member 'someMethod'

我希望两者都失败或两者都过去,所以如果有人可以请你在这个异常情况下启发我。

1 个答案:

答案 0 :(得分:1)

两个代码块之间的差异是所涉及变量的类型。

在第一个块中,delegate显式输入为SomePtotocol,此协议定义了someMethod方法,因此您的语句有效。

在第二个块中,delegate被隐式输入为SomeDelegate,虽然此类符合SomePtotocol,但它并未实现可选方法someMethod,所以你得到一个错误。

如果您将第二个块更改为

let delegate: SomePtotocol = SomeDelegate()
delegate.someMethod?()

相当于第一个块,然后没有错误。