2016-03-20 11 views
0

Ich versuche, ein struct ich von einem Protokollerweiterung Verfahren hergestellt nenne ich auch gemacht:Kann nicht generic initializer von Protokollerweiterung aufrufen in 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 
    } 

Die vier Linien, die nahe dem Ende kommentiert werden, nach dem Ersatz-Algorithmus versuchen, den gleichen Algorithmus wie die Methode in der ersten Erweiterung zu verwenden. Wenn ich die erste dieser Zeilen auskommentiere, wartet der Cursor auf "AdjacentDifferenceArrayGenerator" und sagt: "Kann Initialisierer für den Typ 'AdjacentDifferenceArrayGenerator < _>' nicht mit einer Argumentliste vom Typ '(source: self)'" That last "Self aufrufen "wird in der Fehlermeldung großgeschrieben, obwohl es im Code nicht aktiviert ist. Das Hinzufügen einer expliziten Template-Klammer zwischen den Argumenten type und initializer hat nicht geholfen. Irgendwelche Ideen?

Antwort

0

Ich habe um es durch die erste Iteration herausnehmen:

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

ich da legitim ist, wenn das erste Ergebnis Iteration zu testen, ist es aus der Schleife nehmen bedeutet, dass ich die automatische Kontrolle verloren. Ich weiß nicht, ob die Verwendung von "self" das Problem war, oder es war das Problem, eine generische Sequenz anstelle eines definitiven Arrays zu verwenden. Ich brauche noch Hilfe hier ....

+0

Ich hatte eine "' typeasias GType = AdjacentDifferenceArrayGenerator '" und benutzte diesen Alias, um 'Generator' zu konstruieren, aber das half nicht. Aber ich weiß jetzt, dass der Elementtyp nur aus dem "Quell" -Typ berechnet werden kann. – CTMacUser

Verwandte Themen