Swift2、协议扩展&respondsToSelector
Swift 2, protocol extensions & respondsToSelector
我不确定,在我看来这是 Swift 2.0 中协议扩展的某种错误或错误实现。
我有 protocolA、protocolB 扩展 protocolA 并在 protocolB 扩展中实现方法。
我已经使 class 实例符合协议 B,但是当 respondsToSelector 检查 protocolA/B 方法时,结果是错误的。
import Cocoa
import XCPlayground
protocol ProtocolA : NSObjectProtocol {
func functionA()
}
protocol ProtocolB : ProtocolA {
func functionB()
}
extension ProtocolB {
func functionA() {
print("Passed functionA")
}
func functionB() {
print("Passed functionB")
}
}
class TestClass : NSObject, ProtocolB {
override init () {
}
}
var instance:TestClass = TestClass()
instance.functionA() // Calls code OK..
if instance.respondsToSelector("functionA") {
print("Responds to functionA") // **False, never passing here**
}
if instance.respondsToSelector("functionB") {
print("Responds to functionB") // **False, never passing here**
}
应该报告为错误?
有意思。对我来说看起来像个错误。它确实可以识别 class 上的函数,但不能识别扩展名上的函数。不管 Instance 是什么类型。此外,没有扩展代码将无法编译,因为协议方法是非可选的。所以真的很像bug/feature? in 响应选择器的实现。
我不确定,在我看来这是 Swift 2.0 中协议扩展的某种错误或错误实现。
我有 protocolA、protocolB 扩展 protocolA 并在 protocolB 扩展中实现方法。
我已经使 class 实例符合协议 B,但是当 respondsToSelector 检查 protocolA/B 方法时,结果是错误的。
import Cocoa
import XCPlayground
protocol ProtocolA : NSObjectProtocol {
func functionA()
}
protocol ProtocolB : ProtocolA {
func functionB()
}
extension ProtocolB {
func functionA() {
print("Passed functionA")
}
func functionB() {
print("Passed functionB")
}
}
class TestClass : NSObject, ProtocolB {
override init () {
}
}
var instance:TestClass = TestClass()
instance.functionA() // Calls code OK..
if instance.respondsToSelector("functionA") {
print("Responds to functionA") // **False, never passing here**
}
if instance.respondsToSelector("functionB") {
print("Responds to functionB") // **False, never passing here**
}
应该报告为错误?
有意思。对我来说看起来像个错误。它确实可以识别 class 上的函数,但不能识别扩展名上的函数。不管 Instance 是什么类型。此外,没有扩展代码将无法编译,因为协议方法是非可选的。所以真的很像bug/feature? in 响应选择器的实现。