使具有字符或基于字符的属性的Swift类可编码
Swift 4中的字符类似乎未实现可编码协议。我想了解这一点的基本原理,因为这门课似乎有资格成为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
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不可编码,正如您所说,只有他们知道。