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