Swift 2,协议扩展和respondsToSelector

6

我不确定,但我认为这可能是Swift 2.0中协议扩展的某种错误或不良实现。

我有protocolA和protocolB,protocolB继承自protocolA并在protocolB扩展中实现方法。

我已经使一个类实例符合protocolB,但是当通过respondsToSelector检查protocolA/B方法时,结果为false。

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**
}

应该报告为一个错误吗?

你应该提交一个错误报告。 - John Difool
是的。你已经提交了一个bug吗? :) - tadija
是的,确实是一个 bug。你有提交它吗? - csotiriou
我已经提交了一个非常相似的错误报告 https://bugs.swift.org/browse/SR-544 - Nick
以上对Nick的错误报告的回复表明这是一项功能而非错误,并且不会被修复。respondsToSelector无法工作,也永远无法与协议扩展一同工作。 - emrys57
1个回答

6

有趣。这看起来像是一个错误。它可以识别类中的函数,但不能识别扩展中的函数。无论 Instance 有什么类型。此外,如果没有扩展,代码将无法编译,因为协议方法是非可选的。所以真的看起来像是一个错误/特性?响应选择器实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接