我正在寻找一种优雅的方法来选择数组中的一系列元素以删除并返回,从而改变原始数组。 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/