为什么我不能将指定的初始化程序放入 class 的扩展中?

Why I cannot place a designated initliazer in to a extension of a class?

当我将指定的初始化程序放入结构的扩展中时,它工作正常(请参见下面的示例)

struct BaseOne {
    var a = 12
    var b = 22
}
extension BaseOne {
    init(a: Int){
        self.a = a
        self.b = 231
    }
}

但是,当我为 class 执行此操作时,事情开始出错了

class BaseOne {
    var a = 12
    var b = 22
}
extension BaseOne {
    init(a: Int){  // Error message poped up here 
        self.a = a
        self.b = 231
    }
}

有人可以为我解释一下吗?

谢谢

这是因为 swift 在使用结构时会自动为您生成初始值设定项。所以这是有效的

struct BaseOneStruct {
    var a: Int 
    var b: Int
}
let a = BaseOne(a: 12, b: 32)

即使没有初始化器。 类 但是不要为你做这个。为了让你的代码工作,你必须做这样的事情

class BaseOneClass {
    var a = 12
    var b = 22
    init() { }
}

extension BaseOneClass {
    convenience init(a: Int){ 
        self.init()
        self.a = a
        self.b = 231
    }
}

另请注意,您可以使用空的 init BaseOneStruct(),因为您在定义时为变量设置了值

来自文档

class 的所有指定初始化器必须写在 class 定义本身中,而不是在扩展中,因为完整的指定初始化器集是接口契约的一部分class class.

的子class

编辑:文档 link

https://github.com/apple/swift/blob/master-next/docs/ObjectInitialization.rst