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

чтобы сделать это скомпилировать.

Другие вопросы по тегам