'self' 在 'self.init' 调用或赋值给 'self' 之前使用的错误
Error of 'self' used before 'self.init' call or assignment to 'self' on init in a different module
我检查了共享相同主题的问题,但 none 解决了我遇到的这种奇怪行为:
说我有一个简单的老派 struct
:
struct Person {
var name: String
var age: Int
}
我想像这样在 extension
中重载 init
:
extension Person {
init(name: String) {
self.name = name
self.age = 26
}
}
如您所料,这段代码 运行 就可以了。
但是,如果我将 Person struct
移动到不同的 module
(a.k.a 不同的框架)并将其公开给我的模块,如下所示:
public struct Person {
public var name: String
public var age: Int
}
如果我现在在我的 module
本地重载 extension
中的 init
,编译器会产生以下错误:
'self' used before 'self.init' call or assignment to 'self'
'self.init' isn't called on all paths before returning from initializer
我发现避免此问题的唯一方法是像这样在重载的内部调用原始 init
:
extension Person {
init(name: String) {
self.init(name: name, age: 24)
}
}
我个人觉得这种行为很奇怪。
我是不是漏掉了什么?
实际上这个例子对我有用,只有一个警告说 Initializer for struct 'Person' must use "self.init(...)" or "self = ..." because it is not in module
。据我所知,自 Swift 4.2 以来,结构初始化器被强制定义在结构定义模块的范围内。检查“https://github.com/apple/swift-evolution/blob/master/proposals/0189-restrict-cross-module-struct-initializers.md”中的动机部分。
我检查了共享相同主题的问题,但 none 解决了我遇到的这种奇怪行为:
说我有一个简单的老派 struct
:
struct Person {
var name: String
var age: Int
}
我想像这样在 extension
中重载 init
:
extension Person {
init(name: String) {
self.name = name
self.age = 26
}
}
如您所料,这段代码 运行 就可以了。
但是,如果我将 Person struct
移动到不同的 module
(a.k.a 不同的框架)并将其公开给我的模块,如下所示:
public struct Person {
public var name: String
public var age: Int
}
如果我现在在我的 module
本地重载 extension
中的 init
,编译器会产生以下错误:
'self' used before 'self.init' call or assignment to 'self'
'self.init' isn't called on all paths before returning from initializer
我发现避免此问题的唯一方法是像这样在重载的内部调用原始 init
:
extension Person {
init(name: String) {
self.init(name: name, age: 24)
}
}
我个人觉得这种行为很奇怪。
我是不是漏掉了什么?
实际上这个例子对我有用,只有一个警告说 Initializer for struct 'Person' must use "self.init(...)" or "self = ..." because it is not in module
。据我所知,自 Swift 4.2 以来,结构初始化器被强制定义在结构定义模块的范围内。检查“https://github.com/apple/swift-evolution/blob/master/proposals/0189-restrict-cross-module-struct-initializers.md”中的动机部分。