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() }
}