Swift 5 默认 Decododable 实现,只有一个例外
Swift 5 Default Decododable implementation with only one exception
有没有办法保持 Swift 对 Decodable class 的默认实现,只有 Decodable 对象但有一个例外?
例如,如果我有这样的 struct/class:
struct MyDecodable: Decodable {
var int: Int
var string: String
var location: CLLocation
}
我想对 int
和 string
使用默认解码,但我自己解码 location
。
所以在 init(from decoder:)
我想要这样的东西:
required init(from decoder: Decoder) throws {
<# insert something that decodes all standard decodable properties #>
// only handle location separately
let container = try decoder.container(keyedBy: CodingKeys.self)
location = <# insert custom location decoding #>
}
Is there a way to keep Swift's default implementation for a Decodable class with only Decodable objects but one exception
很遗憾没有。要可解码,所有属性都必须是可解码的。如果您要编写自定义 init
,您必须自己初始化(并因此解码)所有属性。
Apple 知道这很痛苦,并且已经对此事进行了一些思考,但现在 Decodable 的自定义 init
要么全有要么全无。
正如评论中所建议的那样,您可以通过将结构拆分为两种不同的类型来解决此问题。这样你就可以拥有一个只有一个 属性 的类型,你手动初始化它,你就完成了。
有没有办法保持 Swift 对 Decodable class 的默认实现,只有 Decodable 对象但有一个例外? 例如,如果我有这样的 struct/class:
struct MyDecodable: Decodable {
var int: Int
var string: String
var location: CLLocation
}
我想对 int
和 string
使用默认解码,但我自己解码 location
。
所以在 init(from decoder:)
我想要这样的东西:
required init(from decoder: Decoder) throws {
<# insert something that decodes all standard decodable properties #>
// only handle location separately
let container = try decoder.container(keyedBy: CodingKeys.self)
location = <# insert custom location decoding #>
}
Is there a way to keep Swift's default implementation for a Decodable class with only Decodable objects but one exception
很遗憾没有。要可解码,所有属性都必须是可解码的。如果您要编写自定义 init
,您必须自己初始化(并因此解码)所有属性。
Apple 知道这很痛苦,并且已经对此事进行了一些思考,但现在 Decodable 的自定义 init
要么全有要么全无。
正如评论中所建议的那样,您可以通过将结构拆分为两种不同的类型来解决此问题。这样你就可以拥有一个只有一个 属性 的类型,你手动初始化它,你就完成了。