class Gen<T: A> {
func create() -> T {
if T.self is B.Type {
println("YES")
}
return T(id: "cool")
}
}
class A {
let id: String
init(id: String) {
self.id = id
println("class A \(id)")
}
}
class B: A {
override init(id: String) {
println("class B \(id)")
super.init(id: id)
}
}
let coll = Gen<B>()
let t = coll.create()
输出是 “是的” “A级酷”
重写的 B.init 没有输出。
这是编译器错误吗?我需要采取不同的做法吗?
Xcode 6.1
最佳答案
这看起来像是编译器错误。
如果你尝试:
NSStringFromClass(t.dynamicType)
它( Playground )输出类似:
__lldb_expr_781.A
so t
的类型为 A
。更有趣的是:
let t: B = coll.create()
不会产生任何编译错误,但这是一个巨大的编译错误,因为如果实例的类型为A
,则无法将其分配给B
类型的变量> (因为 B
是 A
的子类,但由于多态性,相反的情况也是可能的)。
为了证明这一点:向 B
类添加任意属性,例如:
var x = 0
如果您尝试访问它:
t.x
报告运行时错误 (EXC_BAD_ACCESS)。
另请阅读this Q/A ,这是一个类似的问题(如果不相同)
关于swift - 泛型类不会调用重写的初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556846/