对 Codable 的显式一致性移除了结构上的成员初始化器生成

Explit conformance to Codable removes memberwise initializer generation on structs

鉴于:

struct Foo {
    let bar: Bar
}

我得到了一个方便的初始化器来使用:

let foo = Foo(bar: Bar())

但是,如果 Bar 本身不是 Codable,或者出于其他原因我需要在 Foo 上显式实现 Codable,那么方便的成员初始化器是 no长期存在:

struct Foo: Codable {

    init(from decoder: Decoder) throws {

    }

    func encode(to encoder: Encoder) throws {

    }

    let bar: Bar
}

我得到:

let foo = Foo(bar: Bar())

Incorrect argument label in call (have 'bar:', expected 'from:')


这里可以两全其美吗?

您可以在扩展中实现 Codable 一致性。

在扩展中添加任何结构初始化器时,成员初始化器不会被删除。

struct MyStruct {
    var name: String
}
extension MyStruct: Codable {} // preserves memberwise initializer

MyStruct(name: "Tim")