Swift中数组的简单“拼接”方法是什么?

3

我正在寻找一种优雅的方式来选择要从数组中删除并返回的元素范围,从而改变原始数组。Javascript 有一个 splice 方法可以实现这个目的,但是我似乎找不到任何内置到 Swift 中实现这两个步骤的方法:

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

let oneTwoThree = array.removeAndReturn(0...2) // [1, 2, 3]

// array == [4, 5, 6, 7, 8, 9, 10]

我知道的dropFirst(:), prefix(:)removeSubrange(:) 虽然都可以对数组进行操作,但是它们其中一个只返回值而不改变原始数组,另外两个则会改变原始数组却不返回任何值。
是否有其它我忽略的内置方法可以实现这种需求?或者我需要自己编写扩展 / 方法来完成这个功能?
1个回答

3

removeFirst()removeLast()remove(at:)方法可以移除并返回单个集合元素,但是没有类似的方法可以移除并返回子范围,所以您需要自己实现。

一种可能的实现方式为:

extension RangeReplaceableCollection {
    mutating func splice<R: RangeExpression>(range: R) -> SubSequence
    where R.Bound == Index {
        let result = self[range]
        self.removeSubrange(range)
        return result
    }
}

示例:

var a = [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(a.splice(range: 3...4), a) // [3, 4] [0, 1, 2, 5, 6, 7, 8]
print(a.splice(range: ..<2), a)  // [0, 1] [2, 5, 6, 7, 8]
print(a.splice(range: 2...), a)  // [6, 7, 8] [2, 5]

var data = Data(bytes: [1, 2, 3, 4])
let splice = data.splice(range: 2...2)
print(splice as NSData) // <03>
print(data as NSData)   // <010204>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接