什么是在Swift数组中移除对象的更好方法?

4

在Swift中,从数组中删除对象的更好方法是什么?

var testArray:[SomeObject]
let willRemoveObj:SomeObject
...

testArray = testArray.filter({ $0 != willRemoveObj })

或者

guard let index = testArray.indexOf(willRemoveObj) else {
  return
}
testArray.removeAtIndex(index)

在你的第二部分中添加一个 if。 - Akshansh Thakur
5
这取决于你想要删除与 willRemoveObj 相等的所有对象还是仅删除第一个(或仅有的)对象。 - Martin R
我更喜欢第二个。 - Bing
看一下@MartinR的评论,因为数组可以存储重复的对象。 - Duyen-Hoa
1
这可能会有帮助:https://dev59.com/hGAf5IYBdhLWcg3wLAKq#30724543。 - Martin R
1个回答

5

在Foundation中没有方便的方法,但我们可以使用所需的方法扩展数组结构。请考虑以下内容:

extension Array where Element: Equatable {

    mutating func remove(object: Element) {

        if let index = index(of: object) {

            remove(at: index)
        }
    }
}

var testArray: Array<Int> = [1, 2]
let toBeRemoved: Int = 1

testArray.remove(object: toBeRemoved)

testArray

结果是
[2]

1
函数签名 mutating func remove(_ object: Element) 可以使你的 Swift 3 版本遵循 Swift API 设计准则 - 0x5f3759df
@0x5f3759df 我已经更新了答案。我认为需要“object”标签,因为它可以澄清方法的语义。假如我们有一个索引数组,并且想要删除其中某个元素,那么这时候' remove(someIndex)' 和 'remove(at: index)' 之间的区别就显而易见了。 - Igor B.
嘿@Igor B,感谢您的评论!我可能非常错误,因为我不是母语人士,也不懂Swift,但就我所了解的_Swift API设计指南_而言,我认为“_当第一个参数构成介词短语时,请给它一个参数标签。”规则适用于func remove(at index: Int) -> Element函数,“否则,如果第一个参数构成语法短语,则省略其标签”规则适用于mutating func remove(_ object: Element)函数。 :) - 0x5f3759df
@0x5f3759df 很抱歉回复晚了。你的英语很好。顺便说一下,我也不是母语人士 :) 你对 Swift API 设计准则的理解与我相同。根据它,“Object”标签是不必要的。但是由于还有另一种删除方法,可以在特定索引处进行项目删除,因此我更喜欢为参数保留“object”标签。在索引数组的情况下,由于可能会产生混淆,我们可能会遇到奇怪的错误。我认为这是打破规则的情况。实际上,从我的角度来看,准则只是一组建议,如果需要,我们可以忽略它们。 - Igor B.
嗨 @IgorB,我了解你的观点。仅仅为了试图提供帮助:Set 的删除元素函数 mutating func remove(_ member: Element) 函数也遵循我所描述的“Swift API 设计准则”。remove(at index: Int)remove(_ member: Element) 之间的区别在于前者移除索引处的元素,后者则移除成员。话虽如此,我认为你的观点应该比我的更重要!感谢你的时间,非常感激 : ) - 0x5f3759df

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