不能调用从协议扩展斯威夫特
问题描述:
通用的初始化我试图调用一个struct
我从一个协议扩展方法做我也做了:不能调用从协议扩展斯威夫特
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 < _>'的初始值设定项,其类型为'(source:Self)'的参数列表'”最后一个“Self “在错误消息中大写,尽管它在代码中没有大写。在类型和初始化参数之间添加一个显式的模板括号没有帮助。有任何想法吗?
答
我周围有通过取出第一次迭代:
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
”是问题,或者它是使用通用序列而不是确定性数组是问题所在。在这里仍然需要帮助....
我有一个“'typealias GType = AdjacentDifferenceArrayGenerator'”并使用该别名来构造'generator',但这并没有帮助。但是现在我知道元素类型可以从“源”类型中计算出来。 –
CTMacUser