为什么我不能将指定的initliazer放入类的扩展中?

时间:2016-07-08 19:32:51

标签: swift initializer

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

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

然而,当我在课堂上这样做时,事情开始出错了

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

enter image description here

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

由于

2 个答案:

答案 0 :(得分:2)

来自文件

类的所有指定初始值设定项必须在类定义本身内而不是在扩展中写入,因为完整的指定初始化程序集是与类的子类的接口契约的一部分。

编辑:文档链接

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

答案 1 :(得分:-1)

这是因为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(),因为您可以根据定义为变量设置值