带Zip2的Swift数组扩展

时间:2015-03-06 16:22:40

标签: arrays swift generics

我想创建一个执行此操作的Array扩展: -

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>>)'

(同样,方法签名是否正确?仍然试图了解泛型语法)

1 个答案:

答案 0 :(得分:2)

这可能是一个错误(使用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()方法未再次指定占位符类型<T>,请参阅示例How can I extend typed Arrays in Swift?