我想用具有默认实现属性的可编码结构制作字典。
struct MyStruct: MyStructProtocol {
var value: String
}
该结构实现协议。该协议有两个变量。一个变量具有默认实现。
protocol MyStructProtocol: Encodable {
var defaultValue: String { get }
var value: String { set get }
}
extension MyStructProtocol {
var defaultValue: String { return "my-default-value" }
}
为此,我使用了How can I use Swift’s Codable to encode into a dictionary?中的Encodable
扩展名:
extension Encodable {
var asDictionary: [String: Any]? {
guard let data = try? JSONEncoder().encode(self) else { return nil }
return (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)).flatMap { $0 as? [String: Any] }
}
}
因此,当我实例化该结构并将其“编码”为字典时:
let myStruct = MyStruct(value: "my-value")
let myStructDictionary = myStruct.asDictionary
然后不包括defaultValue
:
["value": "my-value"]
但是我需要的是(包括defaultValue):
["defaultValue": "my-default-value", "value": "my-value"]
答案 0 :(得分:2)
合成编码器仅考虑结构中的成员,不考虑协议扩展中的任何属性或计算的属性。
您必须编写一个自定义初始化程序。而且我更希望该结构采用Encodable
而不是协议。
struct MyStruct: MyStructProtocol, Encodable {
var value: String
private enum CodingKeys: String, CodingKey { case value, defaultValue }
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(value, forKey: .value)
try container.encode(defaultValue, forKey: .defaultValue)
}
}
protocol MyStructProtocol { ...
答案 1 :(得分:0)
Encodable
将无法识别计算出的属性。要解决此问题,请覆盖encode(to:)
函数,如官方文档https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types
编辑:对该问题的可能解决方案: How to use computed property in a codable struct (swift)
答案 2 :(得分:0)
这是因为$baseStr = 'www.abc.com/cdf/?x=10';
$searchStr = 'www.abc.com/';
$insertStr = 'xxx/';
$resultStr = str_replace($searchStr, $searchStr.$insertStr, $baseStr);
echo $resultStr;
的默认值已在协议的扩展名中实现,这意味着它是计算的属性。
www.abc.com/xxx/cdf/?x=10