【问题标题】:Swift Array Extension with Zip2使用 Zip2 的 Swift 数组扩展
【发布时间】:2015-03-06 16:22:40
【问题描述】:

我想创建一个这样做的数组扩展:-

func pairs(tmp: [Any]) -> [(Any, Any)] {
    return Array(Zip2(tmp[0..<tmp.count-1], tmp[1..<tmp.count]))
}

效果很好,但是如果我将它包装在扩展数组中:-

extension Array {
    func pairs<T>() -> [(T, T)] {
        return Array(Zip2(self[0..<self.count-1], self[1..<self.count]))
    }
}

编译器抱怨:-

Cannot find an initializer for type 'Array<T>' that accepts an argument list of type '(Zip2<Slice<T>, Slice<T>>)'

(另外,方法签名是否正确?仍在尝试了解泛型语法)

【问题讨论】:

  • 顺便说一句,你可以把这个写得更简洁一点,func pairs() -&gt; [(T, T)] { return Array&lt;(T, T)&gt;(zip(self, dropFirst(self))) }——zip 只会走两个序列中最短的那个。
  • 谢谢;总是很高兴看到更整洁的做事方式

标签: arrays swift generics


【解决方案1】:

这可能是一个错误(使用 Xcode 6.1.1 和 Xcode 6.3 beta 2 测试)。 它在一个函数中编译和工作,甚至在一个泛型函数中:

func pairs<T>(tmp: [T]) -> [(T, T)] {
    return Array(Zip2(tmp[0..<tmp.count-1], tmp[1..<tmp.count]))
}

但它不能在 Array 扩展方法中编译。 作为一种解决方法,您可以在构造函数中显式指定泛型类型:

extension Array {
    func pairs() -> [(T, T)] {
        return Array<(T, T)>(Zip2(self[0..<self.count-1], self[1..<self.count]))
    }
}

let a = [1, 2, 3, 4]
let b = a.pairs()
println(b) // [(1, 2), (2, 3), (3, 4)]

还要注意pairs() 方法没有再次指定占位符类型&lt;T&gt;,例如How can I extend typed Arrays in Swift?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多