微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Swift中,默认情况下,为什么存储类型为Protocol类型的Struct / Class不符合Codable?

如何解决在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

根据Apple Documentation

使类型可编码的最简单方法是声明其属性 使用已经可编码的类型。这些类型包括标准 库类型,例如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 举报,一经查实,本站将立刻删除。