来自.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'
我希望两者都失败或两者都过去,所以如果有人可以请你在这个异常情况下启发我。
答案 0 :(得分:1)
两个代码块之间的差异是所涉及变量的类型。
在第一个块中,delegate
显式输入为SomePtotocol
,此协议定义了someMethod
方法,因此您的语句有效。
在第二个块中,delegate
被隐式输入为SomeDelegate
,虽然此类符合SomePtotocol
,但它并未实现可选方法someMethod
,所以你得到一个错误。
如果您将第二个块更改为
let delegate: SomePtotocol = SomeDelegate()
delegate.someMethod?()
相当于第一个块,然后没有错误。