我有一个 Swift 类,它可能是也可能不是
Codable
。当它是Codable
时,我希望能够从文件加载它。这是一个简单的例子...
protocol P {
func load()
}
final class A<T>: P {
func load() {
if T.self is Codable.Type {
let decoded = try JSONDecoder().decode(Self.self, from: Data())
}
}
}
extension A: Codable where T: Codable {}
我收到一个错误,指出
T
不是 Codable
,而 JSONDecoder
需要它。这是有道理的,因为即使我进行了运行时检查,对 decode
的调用也不会将 T
限制为 Codable
。
我尝试了很多变体,例如使用
where
子句添加扩展,但我还没有找到明确的答案。
有人知道如何解决这个问题吗?
如果该类不可编码,它是否符合 P?例如。这样的东西会起作用吗?
final class A<T> {}
extension A: Codable, P where T: Codable {
func load() {
let decoded = try? JSONDecoder().decode(Self.self, from: Data())
}
}
缺点是如果 T 不可编码,则无法向 P 添加另一个条件一致性......