gpt4 book ai didi

swift - 通用类不调用重写的初始化程序

转载 作者:可可西里 更新时间:2023-11-01 01:43:29 25 4
gpt4 key购买 nike

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

所以 tA 类型。更有趣的是:

let t: B = coll.create()

不会产生任何编译错误,但这是一个巨大的编译错误,因为如果实例是类型A,它就不能赋值给B类型的变量> (因为 BA 的子类,但由于多态性,相反的情况是可能的)。

证明:向 B 类添加任何属性,例如:

var x = 0

如果您尝试访问它:

t.x

报告运行时错误 (EXC_BAD_ACCESS)。

另请阅读 this Q/A ,这是一个类似的问题(如果不一样的话)

关于swift - 通用类不调用重写的初始化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com