【问题标题】:Explit conformance to Codable removes memberwise initializer generation on structs明确符合 Codable 删除了结构上的成员初始化器生成
【发布时间】:2018-01-08 17:25:25
【问题描述】:

给定:

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(bar: Bar())

调用中的参数标签不正确(有 'bar:',预期为 'from:')


这里有可能两全其美吗?

【问题讨论】:

    标签: swift codable


    【解决方案1】:

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

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

    struct MyStruct {
        var name: String
    }
    extension MyStruct: Codable {} // preserves memberwise initializer
    
    MyStruct(name: "Tim")
    

    【讨论】:

    • 我喜欢这个,这是区分“替换”和“扩展”语义的一种非常好的方法。你想扩展已经存在的东西吗?使用扩展! :D
    • 什么?!加油,苹果。你可以做得更好。 fgs... -_-
    • 不幸的是,如果 struct 在框架内,这将不起作用。
    • 超级棒的答案,我一直在努力解决这个问题,这救了我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多