0
protocol CodableWithDefault: Codable {
    static var `default`: Self { get }
}

extension Set: CodableWithDefault {
    static var `default`: Set {
        return Set()
    }
}

这在 Swift 4 中运行良好,但从 4.1 开始它抱怨:

'CodableWithDefault' requires that 'Element' conform to 'Encodable'

我找不到任何方式来表达我想要的扩展Set也受限于Element实现Encodable

这在 Swift 4.1 中是否可行?

4

2 回答 2

5

有了这个

extension Set: CodableWithDefault { ... }

您正在Set遵守Codable而不提供所需的方法。

在 Swift 4.1 中,只有当 Set 的通用元素是Codable.

所以你需要限制你的扩展

extension Set: CodableWithDefault where Element : Codable {
    static var `default`: Set {
        return Set()
    }
}
于 2018-04-10T13:28:33.217 回答
1

你需要做。要Element Codable使用你的扩展,你需要做

let set = Set<Yourtype>.defaults

请注意,有Yourtype. 这就是编译器的意思Element。现在,如果您使用此代码:

extension Set: CodableWithDefault where Element: Codable {
    static var defaults: Set {
        return Set()
    }
}

代码将编译,因为Element is EncodableDecodable.

于 2018-04-10T13:28:16.987 回答