Swift 4.1 - 集合扩展要求元素符合 Encodable

Swift 4.1 - Set extension requires Element to conform to Encodable

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'

我找不到任何方式来表达我想要限制 ElementSet 的扩展也实现 Encodable.

Swift 4.1 完全可以做到这一点吗?

您需要制作 Element Codable。要使用您的扩展程序,您需要制作

let set = Set<Yourtype>.defaults

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

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

代码将编译,因为 Element EncodableDecodable.

有了这个

extension Set: CodableWithDefault { ... }

您正在使 Set 符合 Codable 而未提供所需的方法。

在Swift 4.1中只有当Set的泛型元素是Codable.

时才可以避免执行需要的方法

所以你需要限制你的扩展

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