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。我该怎么做才能回归真实?
答案 0 :(得分:2)
检查协议的一致性仅适用于与Objective-C兼容的协议,即标有@objc
指令的协议。这是Swift语言的限制,尽管我很乐意看到它消失,但我们现在必须继续使用它。
以下是文档摘录:
只有标记了协议,才能检查协议一致性 使用@objc属性,如上面的HasArea协议所示。这个 attribute表示协议应该暴露给Objective-C 代码和使用Swift与Cocoa和Objective-C中描述。甚至 如果你没有与Objective-C互操作,你需要标记你的 具有@objc属性的协议,如果您希望能够检查 协议一致性。
另请注意,@ objc协议只能由类采用,而不能 通过结构或枚举。如果您将协议标记为@objc in 为了检查一致性,您可以申请 协议只对类类型。
添加@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))