使具有字符或基于字符的属性的Swift类可编码

使具有字符或基于字符的属性的Swift类可编码,swift,character,protocols,codable,Swift,Character,Protocols,Codable,Swift 4中的字符类似乎未实现可编码协议。我想了解这一点的基本原理,因为这门课似乎有资格成为Swift的基础课 看看下面的递归类(有意剥离的),在保留字符作为字典键的同时,什么是使其可编码的最佳方法 class MyClass: Codable { <- does not compile var myProperty: [Character: MyClass]? var myOtherProperty: Int = 42 } class MyClass:Codable

Swift 4中的字符类似乎未实现可编码协议。我想了解这一点的基本原理,因为这门课似乎有资格成为Swift的基础课

看看下面的递归类(有意剥离的),在保留字符作为字典键的同时,什么是使其可编码的最佳方法

class MyClass: Codable { <- does not compile
    var myProperty: [Character: MyClass]?
    var myOtherProperty: Int = 42
}

class MyClass:Codable{您可以使
字符
符合
Codable
协议,如下所示:

extension Character: Codable {
    public init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        let string = try container.decode(String.self)
        guard !string.isEmpty else {
            throw DecodingError.dataCorruptedError(in: container, debugDescription: "Decoder expected a Character but found an empty string.")
        }
        guard string.count == 1 else {
            throw DecodingError.dataCorruptedError(in: container, debugDescription: "Decoder expected a Character but found a string: \(string)")
        }
        self = string[string.startIndex]
    }
    public func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        try container.encode(String(self))
    }
}

操场测试

let aClass = AClass()
let bClass = AClass()
bClass.myOtherProperty = 10
aClass.myProperty = [:]
aClass.myProperty?["B"] = bClass
aClass.myOtherProperty = 20
do {
    let jsonData = try JSONEncoder().encode(aClass)
    print(String(data: jsonData, encoding: .utf8)!)  // "{"myProperty":[["B"],{"myOtherProperty":10}],"myOtherProperty":20}\n"
    let decodedObject = try JSONDecoder().decode(AClass.self, from: jsonData)
    print(decodedObject.myProperty)      // "Optional(["B": __lldb_expr_73.AClass])\n"
    print(decodedObject.myOtherProperty) // 20
} catch {
    print(error)
}

你只需要在扩展中使
字符
符合
可编码的
。至于原理,除了Swift开发人员之外,没有人知道确切的原因,但是由于你可以轻松地将
字符
转换为
字符串
,反之亦然,所以很多人想要对普通的
进行编码/解码是不可能的e> Character
实例到JSON,而不是使用
String
s。谢谢!我怀疑这就是答案,至于为什么Character不可编码,正如您所说,只有他们知道。