为 Swift 嵌套枚举添加 Encodable 扩展

问题描述 投票:0回答:1

我想编码现有

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
接口并“免费”获得实现。

swift enums codable encodable
1个回答
1
投票

你能为嵌套枚举添加

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
.

中的意外字符串
© www.soinside.com 2019 - 2024. All rights reserved.