繁体   English   中英

在“self.init”调用之前使用“self”错误或在不同模块中的 init 上分配给“self”

[英]Error of 'self' used before 'self.init' call or assignment to 'self' on init in a different module

我检查了共享相同主题的问题,但没有一个解决我遇到的这种奇怪行为:

假设我有一个简单的老派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 (也称为不同的框架)并将其公开给我的模块,如下所示:

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 以来,结构初始化程序被强制在结构定义模块的 scope 中定义是设计使然。 检查“ https://github.com/apple/swift-evolution/blob/master/proposals/0189-restrict-cross-module-struct-initializers.md ”中的动机部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM