对象不符合协议

时间:2014-12-23 10:52:47

标签: swift

struct IsProtocol<Pr> {
    static func implementedInObject<T>(object: T) -> Bool {
        return object is Pr
    }
}


protocol A : class {}
class B : A {}

let b = B()
println(IsProtocol<A>.implementedInObject(b))

返回false。我该怎么做才能回归真实?

1 个答案:

答案 0 :(得分:2)

检查协议的一致性仅适用于与Objective-C兼容的协议,即标有@objc指令的协议。这是Swift语言的限制,尽管我很乐意看到它消失,但我们现在必须继续使用它。

以下是文档摘录:

  

只有标记了协议,才能检查协议一致性   使用@objc属性,如上面的HasArea协议所示。这个   attribute表示协议应该暴露给Objective-C   代码和使用Swift与Cocoa和Objective-C中描述。甚至   如果你没有与Objective-C互操作,你需要标记你的   具有@objc属性的协议,如果您希望能够检查   协议一致性。

     

另请注意,@ objc协议只能由类采用,而不能   通过结构或枚举。如果您将协议标记为@objc in   为了检查一致性,您可以申请   协议只对类类型。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

添加@objc后,它可以正常运行:

struct IsProtocol<Pr> {
    static func implementedInObject<T>(object: T) -> Bool {
        return object is Pr
    }
}

@objc protocol A {}
class B : A {}

let b = B()
println(IsProtocol<A>.implementedInObject(b))