下面的代码把一个 Array 分解为 Array 第一个元素和剩余部分,并放入一个 Tuple。如果 Array 为空,则返回 nil:

extension Array {
    var decompose : (head: T, tail: [T])? {
        return (count > 0) ? (self[0], Array(self[1..<count])) : nil
    }
}

当上述代码和if let语句或者模式匹配结合时会非常有用。举例来说,这是递归形式的sum

func sum(xs: [Int]) -> Int {
    if let (head, tail) = xs.decompose {
        return head + sum(tail)
    } else {
        return 0
    }
}

你可以非常容易地为其他类型(比如 DictionaryString)定义自己的 decompose 函数。


本文翻译自:Functional Snippet #1: Decomposing Arrays