swift - 泛型类不会调用重写的初始值设定项

标签 swift

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类型的变量> (因为 BA 的子类,但由于多态性,相反的情况也是可能的)。

为了证明这一点:向 B 类添加任意属性,例如:

var x = 0

如果您尝试访问它:

t.x

报告运行时错误 (EXC_BAD_ACCESS)。

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

关于swift - 泛型类不会调用重写的初始值设定项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556846/

相关文章:

ios - Xcode Swift 计算 23 个文本字段值的平均值

ios - UIButton 中的 UIImage 用矢量图像像素化

swift - 如何在 SwiftUI 的应用程序文件中使用 EnvironmentObject

SWIFT 对具有特定对象的不同对象集合的单元格进行排序

ios - 从字典中读取整数数据并进行简单计算

swift - 在 NSTokenField 中设置 token

ios - 当 iOS 设置中的通知发生更改时,Amazon SNS 如何禁用/重新启用设备?

ios - 我应该使用 NSUserDefault、字典、核心数据 - 还是其他东西?

class - 如何用 Swift 写 : [MyClass class]?

ios - 在 SwiftUI 中呈现 NavigationLink 时过渡动画消失了