arrays - 使用 Zip2 进行 Swift 数组扩展

标签 arrays swift generics

我想创建一个数组扩展来执行此操作:-

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? .

关于arrays - 使用 Zip2 进行 Swift 数组扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28903059/

相关文章:

Swift 4 和 Firebase 附加所有带有用户名和个人资料图像错误的帖子

python - 这些奇特的 TypeVar 的 PyCharm 生成了什么?

C# 确定泛型类型

java - 缺少一些代码;具有 Add() 和 Remove() 方法的 ArrayList 模式

javascript - 解析云代码 全部保存

php - 使用引用 : foreach ($a as &$v) { . 时 foreach 的奇怪行为 ..}

ios - 双向 gRPC 流有时会在停止和启动后停止处理响应

xcode - 工具栏中的间隙,Xcode

c# - 泛型、抽象类、构造函数

c++ - 将 Vec* 转换为 double*