Swift 2 自省

Swift 2 Introspection

我正在将一些 "old" Swift 代码转换为 Swift 2.0,我 运行 变成了一个我无法摆脱的错误。
我的函数接收一个类型(任意)的数组,returns一个相同类型的新数组。

此代码不再适用于 Swift 2.0:

func makePattern1<T>(var list: Array<T>) -> Array<T> {
    let theType = list.dynamicType
    var result = theType()
    for i in 1..<list.count {
        result.append(list[i])
        result.append(list[i-1])
    }
    return result
}

给出错误信息:"Initializing from a metatype value must reference 'init' explicitly".

更正代码: var result = theType.init() 给出 "Type of expression is ambiguous without more context" 错误。

我错过了什么?

此代码是在 Swift 2.1 中编写的,并且确实按照您在评论中的要求使用了 map 函数。

func makePattern1<T>(list: [T]) -> [T] {
    return list[0..<list.count-1]
        .enumerate()
        .map { [list[[=10=].index+1], list[[=10=].index]] }
        .flatten()
        .map { [=10=] as T }
}

更新#1

(感谢 Martin R)

func makePattern1<T>(list: [T]) -> [T] {
    return list[0..<list.count-1]
        .enumerate()
        .flatMap { [list[[=11=].index+1], list[[=11=].index]] }
}

更新#2

func makePattern1<T>(list: [T]) -> [T] {
    return [Int](1..<list.count).flatMap { [list[[=12=]], list[[=12=]-1]] }
}

测试

makePattern1([1,2,3,4,5]) // > [2, 1, 3, 2, 4, 3, 5, 4]

纯属娱乐:另一种解决方案:

func makePattern2<T>(list: [T]) -> [T] {
     return zip(list.dropFirst(), list).flatMap { [[=10=], ] }
}

let m = makePattern2([1,2,3,4,5])
print(m) // [2, 1, 3, 2, 4, 3, 5, 4]

备注:

  • list.dropFirst() 是除了第一个数组元素之外的所有元素的序列。
  • zip(list.dropFirst(), list) 是一个序列 (list[[=13=].i+1], list[[=13=].i]) 个元组。
  • flatMap { [[=14=], ] } 再次将这些元组组合成一个数组。