如何解决在Swift中,默认情况下,为什么存储类型为Protocol类型的Struct / Class不符合Codable?
下面的代码可以正常编译(Swift 5.0 +)
import Foundation
protocol PriceType: Codable {
var value: Double {get set}
var currency: String {get set}
}
struct Price: PriceType {
var value: Double
var currency: String
}
struct Quantity: Codable {
var value: Double
var unit : String
}
struct commodity: Codable {
var price: Price
var quantity: Quantity
}
struct commodity: Codable {
var price: PriceType
var quantity: Quantity
}
我所做的唯一更改是我创建了PriceType类型的price属性。
我遇到错误
错误:019-可编码v2.xcplaygroundpage:20:8:错误:类型“商品”不符合协议“可解码” 结构商品:可编码{ ^
019-可编码v2.xcplaygroundpage:21:9:注意:由于“ PriceType”不符合“可解码”,因此无法自动合成“可解码” 变量价格:PriceType ^
错误:019-可编码v2.xcplaygroundpage:20:8:错误:类型“商品”不符合协议“可编码” 结构商品:可编码{ ^
019-可编码v2.xcplaygroundpage:21:9:注意:由于“ PriceType”不符合“ encodable”,因此无法自动合成“ encodable” 变量价格:PriceType
使类型可编码的最简单方法是声明其属性 使用已经可编码的类型。这些类型包括标准 库类型,例如String,Int和Double;和基金会类型,例如 日期,数据和URL。属性可编码的任何类型 只需声明一致性即可自动符合Codable。
由于PriceType符合Codable,因为它的两个属性(即值和货币)默认为Codable,因此为什么代码无法编译,如果我将类型设为PriceType(协议)而不是Price(结构) )??
解决方法
协议不符合其自身或所继承的协议,请参阅:Protocol extending Encodable (or Codable) does not conform to it。该问题不会得到解决,请参见:https://bugs.swift.org/browse/SR-5853?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel
我认为您真正想要的是这样的东西:
struct Commodity<T: PriceType>: Codable {
var price: T
var quantity: Quantity
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。