我想编码现有
NWInterface
类的实例,它有一个type
类型的NWInterface.InterfaceType
字段,这是一个enum
.
有没有办法轻松地将
Encodable
接口添加到该嵌套类型?目前我的解决方法是在封闭类的扩展中处理编码:
extension NWInterface : Encodable {
enum CodingKeys: CodingKey {
case name
case type
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
switch type {
case .wifi:
try container.encode("wifi", forKey: .type)
case .cellular:
try container.encode("cellular", forKey: .type)
case .wiredEthernet:
try container.encode("ethernet", forKey: .type)
case .loopback:
try container.encode("loopback", forKey: .type)
case .other:
try container.encode("other", forKey: .type)
default:
try container.encode("unknown", forKey: .type)
}
}
}
这感觉不令人满意,特别是因为对于我自己定义的
enum
类型,我可以简单地在定义点添加Encodable
接口并“免费”获得实现。
你能为嵌套枚举添加
Encodable
一致性吗?
是
你是否免费获得它,就像你自己的枚举一样?
没有。我不知道为什么,但是自动
Codable
合成似乎要求扩展名与 struct
、class
或 enum
. 在同一个文件中
这是扩展嵌套
enum
的实现的样子。
extension NWInterface : Encodable {
enum CodingKeys : CodingKey {
case name, type
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(type, forKey: .type)
}
}
extension NWInterface.InterfaceType : Encodable {
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
switch self {
case .wifi:
try container.encode("wifi")
case .cellular:
try container.encode("cellular")
case .wiredEthernet:
try container.encode("ethernet")
case .loopback:
try container.encode("loopback")
case .other:
try container.encode("other")
default:
try container.encode("unknown")
}
}
}
您还可以将第二个扩展压缩到:
extension NWInterface.InterfaceType : Encodable {
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
try container.encode("\(self)")
}
}
前提是您采取适当措施处理
Decoder
. 中的意外字符串