簡體   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