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'
我找不到任何方式来表达我想要限制 Element
的 Set
的扩展也实现 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
是 Encodable
和 Decodable
.
有了这个
extension Set: CodableWithDefault { ... }
您正在使 Set
符合 Codable
而未提供所需的方法。
在Swift 4.1中只有当Set的泛型元素是Codable
.
时才可以避免执行需要的方法
所以你需要限制你的扩展
extension Set: CodableWithDefault where Element : Codable {
static var `default`: Set {
return Set()
}
}
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'
我找不到任何方式来表达我想要限制 Element
的 Set
的扩展也实现 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
是 Encodable
和 Decodable
.
有了这个
extension Set: CodableWithDefault { ... }
您正在使 Set
符合 Codable
而未提供所需的方法。
在Swift 4.1中只有当Set的泛型元素是Codable
.
所以你需要限制你的扩展
extension Set: CodableWithDefault where Element : Codable {
static var `default`: Set {
return Set()
}
}