对Codable的Explit一致性消除了结构上的成员初始化器生成

Ale*_*ach 6 swift codable

鉴于:

struct Foo {
    let bar: Bar
}
Run Code Online (Sandbox Code Playgroud)

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

let foo = Foo(bar: Bar())

但是如果Bar不是本身Codable,或者由于某些其他原因我需要明确地实现Codable,Foo那么便利成员初始化器不再存在:

struct Foo: Codable {

    init(from decoder: Decoder) throws {

    }

    func encode(to encoder: Encoder) throws {

    }

    let bar: Bar
}
Run Code Online (Sandbox Code Playgroud)

我得到:

let foo = Foo(bar: Bar())

调用中的参数标签不正确(有'bar:',期望'来自:')


是否有可能在这里拥有两全其美?

Pal*_*lle 12

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

在扩展中添加任何struct初始化程序时,不会删除成员初始值设定项.

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

MyStruct(name: "Tim")
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,如果 struct 位于框架内,则这不起作用。 (3认同)
  • 我喜欢这个,这是区分“替换”与“扩展”语义的一种很好的方式。您想扩展已有的内容吗?使用扩展程序!:D (2认同)