Swift 带 Zip2 的数组扩展
Swift Array Extension with Zip2
我想创建一个执行此操作的数组扩展:-
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>>)'
(另外,方法签名是否正确?仍在努力了解泛型语法)
这可能是一个错误(使用 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?.
我想创建一个执行此操作的数组扩展:-
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>>)'
(另外,方法签名是否正确?仍在努力了解泛型语法)
这可能是一个错误(使用 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?.