我制作了一个协议Stringify,将实现协议的类型转换为字符串。
0x23
但是当我将一个Ints集合设置为一个属性并在其上使用然后使用stringify()时,它将无法工作。
错误:
在“集合”上引用实例方法“ stringify()”需要 类型“ Int”和“ Stringify”是等效的
如果我直接使用它,一切都会很好。
这是什么问题?
答案 0 :(得分:2)
extension Collection where Iterator.Element == Stringify
具有“相同类型要求”,并定义了元素类型为Stringify
的集合的扩展。但是test
是Int
的数组,即元素符合符合Stringify
协议。所以你想要的是
extension Collection where Iterator.Element : Stringify
或等效地
extension Collection where Element : Stringify
原因
/// does work
[6,5,34].stringify()
使用您的原始定义进行编译是因为编译器从上下文中将数组的类型推断为[Stringify]
。
let test: [Stringify] = [5,6,7]
test.stringify()
也将进行编译。
请注意,无需在扩展方法中强制转换self
。您可以将实现简化为
func stringify() -> [String] {
var strings = [String]()
for element in self {
strings.append(element.stringify())
}
return strings
}
或者只是
func stringify() -> [String] {
return self.map { $0.stringify() }
}