解码仅有条件“可编码”的 Swift 类型

问题描述 投票:0回答:1

我有一个 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
子句添加扩展,但我还没有找到明确的答案。

有人知道如何解决这个问题吗?

swift generics protocols decodable
1个回答
0
投票

如果该类不可编码,它是否符合 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 添加另一个条件一致性......

© www.soinside.com 2019 - 2024. All rights reserved.