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 中可能吗?
有了这个
extension Set: CodableWithDefault { ... }
您正在使Set
符合Codable
,而没有提供所需的方法。
在 Swift 4.1 中,只有当 Set 的泛型元素Codable
时,才能避免实现所需的方法。
所以你需要限制你的扩展
extension Set: CodableWithDefault where Element : Codable {
static var `default`: Set {
return Set()
}
}
做Element
Codable
。若要使用扩展,需要执行
let set = Set<Yourtype>.defaults
请注意,有Yourtype
.这就是编译器所说的Element
的意思。现在,如果您使用此代码:
extension Set: CodableWithDefault where Element: Codable {
static var defaults: Set {
return Set()
}
}
代码将编译,因为Element
Encodable
且Decodable
。