符合Codable协议的结构体将不再生成成员逐一初始化器。

10

假设:

struct Foo {
    let bar: Bar
}

我使用一个方便的初始化程序:

let foo = Foo(bar: Bar())

但如果Bar本身不是Codable,或者出于其他某种原因我需要在Foo上显式实现Codable,那么方便的按成员初始化程序将不再存在:

struct Foo: Codable {

    init(from decoder: Decoder) throws {

    }

    func encode(to encoder: Encoder) throws {

    }

    let bar: Bar
}

我得到了如下内容:

let foo = Foo(from: Bar())

调用中的参数标签不正确(应为'from:'而不是'bar:')


这里是否可能两全其美?

1个回答

18

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

当在扩展中添加任何结构体初始化程序时,成员逐一初始化程序不会被删除。

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

MyStruct(name: "Tim")

2
我喜欢这个,这是一个非常好的区分“替换”和“扩展”语义的方式。你想要扩展已经存在的内容吗?使用扩展!:D - Alexander
什么?!拜托,苹果。你可以做得比那更好。真是的...-_- - RawKnee
5
如果结构体在框架内部,这种方法就行不通了。 - Puneet Sharma
非常棒的答案,我一直在为这个问题苦恼,这篇文章帮了我大忙。 - anoop4real

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接