繁体   English   中英

无法在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM