在“集合”上引用实例方法“ stringify()”要求类型“ Int”和“ Stringify”等效

时间:2019-07-11 11:57:02

标签: swift protocols

我制作了一个协议Stringify,将实现协议的类型转换为字符串。

0x23

但是当我将一个Ints集合设置为一个属性并在其上使用然后使用stringify()时,它将无法工作。

错误:

  

在“集合”上引用实例方法“ stringify()”需要   类型“ Int”和“ Stringify”是等效的

如果我直接使用它,一切都会很好。

这是什么问题?

1 个答案:

答案 0 :(得分:2)

extension Collection where Iterator.Element == Stringify 

具有“相同类型要求”,并定义了元素类型为Stringify的集合的扩展。但是testInt的数组,即元素符合符合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() }
}