【发布时间】:2019-11-23 08:56:09
【问题描述】:
在应用程序中,我们有两种类型的贴纸,字符串和位图。每个贴纸包可以包含两种类型。这就是我声明模型的方式:
// Mark: - Models
protocol Sticker: Codable {
}
public struct StickerString: Sticker, Codable, Equatable {
let fontName: String
let character: String
}
public struct StickerBitmap: Sticker, Codable, Equatable {
let imageName: String
}
在用户选择并使用了一些贴纸后,我们想将这些贴纸保存到UserDefaults,这样我们就可以向他展示“最近使用的”贴纸标签。我正在尝试解码保存的[Sticker] 数组:
let recentStickers = try? JSONDecoder().decode([Sticker].self, from: data)
但我得到以下编译错误:
Protocol type 'Sticker' cannot conform to 'Decodable' because only concrete types can conform to protocols
我不明白为什么我将Sticker 声明为Codable,它也实现了Decodable。任何帮助将不胜感激!
【问题讨论】:
-
这个错误告诉你到底出了什么问题:一个协议不能符合一个协议。
decode的第一个参数必须是具体类型。一种解决方案是使用限制为Codable的泛型类型。 -
@vadian 嘿 Vadian!感谢你的回复。可能是我的英语水平不够。我不明白“具体类型”是什么意思。我会尝试像你写的那样想出一个通用类型的解决方案
-
您的代码包含两种具体类型,
StickerString和StickerBitmap。 -
@vadian 我在
Sticker和StickerString和StickerBitmap中添加了associatedtype我在typealias中分配了自己的类型,但它给了我同样的错误。我可以声明一个[Sticker]数组还是必须是其中一种具体类型?
标签: ios swift protocols codable decodable