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

使通用类可编码

如何解决使通用类可编码

我有这门课:

class Course<T: dish> {
    var amount: Int
    var type: T
    init(amount: Int,type: T) {
        self.amount = amount
        self.type = type
    }
}

我无权访问 dish。但让我们假设这个实现:

class dish {
    var calories: Double
    init(calories: Double) {
        self.calories = calories
    }
}

class Pudding: dish {
    static var iceCream = dish(calories: 400)
    static var chocoloteMousse = dish(calories: 600)
}

我现在想像这样将它编码/解码为 JSON:

import Foundation
var course = Course(amount: 1,type: Pudding.iceCream)
var encoded = try JSONEncoder().encode(course)
var decoded = try JSONDecoder().decode(Course.self,from: encoded)

所以我添加Codable 一致性:

class Course<T: dish>: Codable

由于 Codable函数无法合成,我收到以下错误消息:

Type 'Course' does not conform to protocol 'Decodable'
Type 'Course' does not conform to protocol 'encodable'

所以,我需要自己编写 init 和 encode()。

在初始化程序的某个地方,我会解码泛型类型 T

函数签名中没有对该类型的引用时,如何在初始化程序中指定类型 T 以使其通用?

required init<T: dish>(from decoder: Decoder) throws

以上导致此错误消息 Generic parameter 'T' is not used in function signature

解决方法

就像上面其他人所说的那样,您还没有证明它必须是通用的。但是如果你能做到这一点,并且你不能只是将 Dish 扩展为 Codable,只需对本地菜进行限制。并重命名它,因为“T”和“类型”是不精确的。

class Course<Dish: ModuleName.Dish & Codable>: Codable {
  var amount: Int
  var dish: Dish

你能做的最好的事情就是禁止子类化。永远,在你自己的所有类型中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。