[英]Can't call extension method on generic Array class when element type is a Protocol [Swift]
[英]Can't invoke generic initializer from protocol extension in Swift
我想打电话给一个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
”上等待,并说:“无法为类型为'(source:Self)'的参数列表调用'AdjacentDifferenceArrayGenerator <_>'类型的初始化程序”尽管错误代码中没有大写字母,但错误消息中的大写字母仍为大写。 在type和initializer参数之间添加显式模板括号没有帮助。 有任何想法吗?
我通过进行第一次迭代来解决了这个问题:
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
”是问题,还是使用通用序列而不是确定性数组是问题。 仍然需要帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.