![](/img/trans.png)
[英]swift Convert dictionary to jsonString error : Protocol type 'Any' cannot conform to 'Encodable' because only concrete types can conform to protocols
[英]How to encode a property with type of JSON dictionary in Swift 4 encodable protocol
好吧,我的問題很簡單。 我想做與此答案相同的操作,但要進行編碼: 如何在Swift 4可解碼協議中使用JSON字典類型解碼屬性
該解決方案可以很好地與解碼配合使用,但是我還需要對Dictionary<String, Any>
進行編碼
我不知道如何為KeyedEncodingContainer
和其他擴展編寫擴展,以及編寫什么方法。
您可以通過根據問題的答案改編可解碼代碼段來實現
extension KeyedEncodingContainerProtocol where Key == JSONCodingKeys {
mutating func encodeJSONDictionary(_ value: Dictionary<String, Any>) throws {
try value.forEach({ (key, value) in
let key = JSONCodingKeys(key: key)
switch value {
case let value as Bool:
try encode(value, forKey: key)
case let value as Int:
try encode(value, forKey: key)
case let value as String:
try encode(value, forKey: key)
case let value as Double:
try encode(value, forKey: key)
case let value as Dictionary<String, Any>:
try encode(value, forKey: key)
case let value as Array<Any>:
try encode(value, forKey: key)
case Optional<Any>.none:
try encodeNil(forKey: key)
default:
throw EncodingError.invalidValue(value, EncodingError.Context(codingPath: codingPath + [key], debugDescription: "Invalid JSON value"))
}
})
}
}
extension KeyedEncodingContainerProtocol {
mutating func encode(_ value: Dictionary<String, Any>, forKey key: Key) throws {
var container = self.nestedContainer(keyedBy: JSONCodingKeys.self, forKey: key)
try container.encodeJSONDictionary(value)
}
mutating func encodeIfPresent(_ value: Dictionary<String, Any>?, forKey key: Key) throws {
if let value = value {
try encode(value, forKey: key)
}
}
mutating func encode(_ value: Array<Any>, forKey key: Key) throws {
var container = self.nestedUnkeyedContainer(forKey: key)
try container.encodeJSONArray(value)
}
mutating func encodeIfPresent(_ value: Array<Any>?, forKey key: Key) throws {
if let value = value {
try encode(value, forKey: key)
}
}
}
extension UnkeyedEncodingContainer {
mutating func encodeJSONArray(_ value: Array<Any>) throws {
try value.enumerated().forEach({ (index, value) in
switch value {
case let value as Bool:
try encode(value)
case let value as Int:
try encode(value)
case let value as String:
try encode(value)
case let value as Double:
try encode(value)
case let value as Dictionary<String, Any>:
try encode(value)
case let value as Array<Any>:
try encode(value)
case Optional<Any>.none:
try encodeNil()
default:
let keys = JSONCodingKeys(intValue: index).map({ [ $0 ] }) ?? []
throw EncodingError.invalidValue(value, EncodingError.Context(codingPath: codingPath + keys, debugDescription: "Invalid JSON value"))
}
})
}
mutating func encodeJSONDictionary(_ value: Dictionary<String, Any>) throws {
var nestedContainer = self.nestedContainer(keyedBy: JSONCodingKeys.self)
try nestedContainer.encodeJSONDictionary(value)
}
}
這是一個代碼片段
但是,此代碼段將在Swift 4.1中失敗,該版本應在2018年上半年發布。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.