当我将指定的初始化程序放入结构的扩展名时,它工作正常(请参阅示例如下)
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
}
}
有人可以为我解释一下吗?
由于
答案 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(),因为您可以根据定义为变量设置值