2016-03-20 48 views
0

通用的初始化我试图调用一个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 “在错误消息中大写,尽管它在代码中没有大写。在类型和初始化参数之间添加一个显式的模板括号没有帮助。有任何想法吗?

回答

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',但这并没有帮助。但是现在我知道元素类型可以从“源”类型中计算出来。 – CTMacUser