【问题标题】:Can't invoke generic initializer from protocol extension in Swift无法从 Swift 中的协议扩展调用泛型初始化程序
【发布时间】:2016-07-06 22:02:34
【问题描述】:

我正在尝试调用我从我也制作的协议扩展方法制作的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<_>' 的初始化程序”最后“Self”在错误消息中大写,尽管它在代码中没有大写。在类型和初始化器参数之间添加显式模板括号没有帮助。有什么想法吗?

【问题讨论】:

    标签: swift generics initializer


    【解决方案1】:

    我通过第一次迭代解决了这个问题:

    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&lt;Self.Generator.Element.Stride&gt;”并使用该别名构造generator,但这并没有帮助。但我现在知道元素类型可以仅从 source 的类型计算出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多