2016-03-20 4 views
0

Я пытаюсь вызвать struct я сделал из метода расширения протокола я сделал:не может ссылаться на общий инициализаторе от расширения протокола в Swift

public struct AdjacentDifferenceArrayGenerator<T: Strideable where T.Stride == T>: GeneratorType { 
    private var array: [T] 
    public init<U: SequenceType where U.Generator.Element == T>(source: U) { 
     self.array = source.adjacentDifference() 
    } 
    public mutating func next() -> [T]? { 
     guard !array.isEmpty else { 
      return nil 
     } 
     defer { 
      self.array = self.array.adjacentDifference() 
     } 
     return self.array 
    } 
} 

public extension SequenceType where Generator.Element: Strideable { 
    public func adjacentDifference() -> [Self.Generator.Element.Stride] { 
     var result: [Self.Generator.Element.Stride] = [] 
     var generator = AdjacentDifferenceGenerator(generator: self.generate()) 
     while let difference = generator.next() { 
      result.append(difference) 
     } 
     return result 
    } 
} 

public extension SequenceType where Generator.Element: Strideable, Generator.Element.Stride: Strideable, Generator.Element.Stride.Stride == Generator.Element.Stride { 
    public func pyramidOfAdjacentDifferences() -> [[Self.Generator.Element.Stride]] { 
     var result: [[Self.Generator.Element.Stride]] = [] 
     var array = self.adjacentDifference() 
     while !array.isEmpty { 
      result.append(array) 
      array = array.adjacentDifference() 
     } 
     //var generator = AdjacentDifferenceArrayGenerator(source: self) 
     //while let differences = generator.next() { 
      //result.append(differences) 
     //} 
     return result 
    } 

четыре линии, которые комментируются ближе к концу, после замены алгоритма, пытаются использовать тот же алгоритм, что и метод в первом расширении. Когда я раскомментирую первую из этих строк, курсор ждет «AdjacentDifferenceArrayGenerator» и говорит: «Невозможно вызвать инициализатор для типа« AdjacentDifferenceArrayGenerator < _> »с списком аргументов типа« (источник: Self) »« Это последнее «Я» msgstr "капитализируется в сообщении об ошибке, хотя он некапитализирован в коде. Добавление явной скобки шаблона между аргументами типа и инициализатора не помогло. Есть идеи?

ответ

0

я вокруг него, беря первую итерацию:

public extension SequenceType where Generator.Element: Strideable, Generator.Element.Stride: Strideable, Generator.Element.Stride.Stride == Generator.Element.Stride { 
    public func pyramidOfAdjacentDifferences() -> [[Self.Generator.Element.Stride]] { 
     var result = [self.adjacentDifference()] 
     if result.first!.isEmpty { 
      return [] 
     } 

     var generator = AdjacentDifferenceArrayGenerator(source: result.first!) 
     while let differences = generator.next() { 
      result.append(differences) 
     } 
     return result 
    } 
} 

Я должен проверить, если это первый результат итерации является законным, так как вынимая его из цикла означает, что я потерял автоматическую проверку. Я не знаю, была ли проблема с использованием «self», или она использовала общую последовательность вместо определенного массива. Еще нужна помощь здесь ....

+0

У меня был «typealias GType = AdjacentDifferenceArrayGenerator ' "и использовал этот псевдоним для создания' generator', но это не помогло. Но теперь я знаю, что тип элемента можно вычислить только из типа 'source'. – CTMacUser