对 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")
鉴于:
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")