Swift 4: невозможно вызвать значение нефункционального типа '[Self.Element.Type]' при создании экземпляра массива связанного типа
Я делал некоторые упражнения на Xcode 9 beta 2 Swift 4 из этой статьи ( https://www.uraimo.com/2016/01/06/10-Swift-One-Liners-To-Impress-Your-Friends/), когда Я столкнулся с ошибкой при выполнении пункта №. 6:
extension Sequence{
typealias Element = Self.Iterator.Element
func partitionBy(fu: (Element)->Bool)->([Element],[Element]){
var first=[Element]()
var second=[Element]()
for el in self {
if fu(el) {
first.append(el)
}else{
second.append(el)
}
}
return (first,second)
}
}
Xcode 9 выдавал ошибку в следующих строках:
var first=[Element]()
var second=[Element]()
Полная ошибка ниже:
error: Swift-Playground.playground:6:29: error: cannot call value of non-function type '[Self.Element.Type]'
var second=[Element]()
Ошибка сохраняется, даже если я удаляю typealias и использую полный Self.Iterator.Element
тип.
Этот код прекрасно работает на Swift 3. Я не вижу причин, по которым он не должен работать на Swift 4. Может ли кто-нибудь помочь мне, если это изменение в Swift 4 с точки зрения обработки связанных типов и, если да, то какова альтернатива создания экземпляра массив.
1 ответ
Решение
В Swift 4, protocol Sequence
уже определяет
associatedtype Element where Self.Element == Self.Iterator.Element
так что вы можете просто удалить
typealias Element = Self.Iterator.Element
чтобы сделать это скомпилировать.