arrays - Swift 中数组的简单 "splice"类型方法?

标签 arrays swift

我正在寻找一种优雅的方法来选择数组中的一系列元素以删除并返回,从而改变原始数组。 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(:) 但它们都只返回值而不改变原始数组,或者它们在不返回值的情况下改变原始数组。

我是否错过了另一种内置方法,或者我是否必须实现自定义扩展/方法才能使其正常工作?

最佳答案

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>

关于arrays - Swift 中数组的简单 "splice"类型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52922279/

相关文章:

C,函数中的静态数组不好的做法?

ios - UITableViewCell 约束更新仅在滚动后发生

Swift 跳过 "else if"

ios - 在我的 viewDidAppear 中,我怎么知道它何时被 child 解开?

swift - Swift 3 中数据的 MD5

ios - 数组打印 API 调用的相同结果

c++ - 在堆上分配指针数组

php - 如何在php中获得大于0的最小正值

c++ - 指针/引用数组?

java - 如何增加Java中数组的大小?