Xcode 9.3(Swift 4.1を使用)に更新した後、次の問題が見つかりました。
空のプロジェクトを作成し、新しい.Swiftファイルを追加して、2つの新しいクラスを作成します。
class CodableOne: Codable {
let some: String
}
class CodableTwo: Codable {
var some: String
}
ビルドは成功します
タイプCodableOne
のCodableTwo
に新しい定数を追加します。
class CodableOne: Codable {
let some: String
let another: CodableTwo
}
class CodableTwo: Codable {
var some: String
}
ビルドは成功します
クラスCodableTwo
を別のファイルに移動します(たとえば、ViewController.Swift)
ビルドは失敗します。
これでエラーが発生しますが、これは消えません。 Codable
クラスは、初期化子を必要とするべきではありません(前のステップで示したように)。
この背後にある問題とその解決方法に関するアイデアは大歓迎です!
追伸Xcode 9.2には問題はありません。プロジェクト/ビルドパスのクリーニングも、Xcode 9.3の再インストールも役立ちません。
コメントに記載 のように、私は2つのことをしなければなりませんでした:
これは、Swift 4.1
コンパイラのバグです。この問題を回避するには、4kmanの回答に記載されている手順を実行するか、宣言のlet
を単にvar
に変更します。
class C1 : Decodable {
let str: String
// error: Class 'C1' has no initializers - if class C's `c1` is a let constant.
}
class C : Decodable {
var c1: C1 // << Change to `var`, compilation succeeds.
}
回避策 りんごの礼儀Swiftエンジニア 。
これもthe4kmansの回答も役に立たない場合は、コンパイルしないモデルに別のinit
を追加できます。クラスに大量の変数がある場合は、init
をクラッシュさせてコンパイラを満足させます。 Codable
初期化子は引き続き合成されます。
class C1: Decodable {
let str: String
@available(*, deprecated, message: "Do not use.")
private init() {
fatalError("Swift 4.1")
}
}
すべてのクラスが同じファイルにあるにもかかわらずこの問題が発生しましたが、より深いクラスに構造体を使用するとうまくいくようです