【问题标题】:What is the better way to remove object in swift Array在快速数组中删除对象的更好方法是什么
【发布时间】:2016-09-29 02:38:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在你的第二部分添加一个 if
  • 这取决于您是要删除比较等于willRemoveObj所有 个对象,还是只删除第一个(或唯一)一个。
  • 我更喜欢第二个。
  • 看看@MartinR 的评论,因为数组可以存储重复的对象。
  • 这可能会有所帮助:stackoverflow.com/a/30724543/1187415.

标签: arrays swift swift2.2


【解决方案1】:

基金会没有方便的方法。但是我们可以用需要的来扩展 Array 结构。考虑一下:

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]

【讨论】:

  • 函数签名mutating func remove(_ object: Element) 将使您的Swift 3 版本遵循Swift API design guidelines
  • @0x5f3759df 我已经更新了答案。我认为需要“对象”标签,因为它阐明了方法语义。如果我们有索引数组并想要删除某人怎么办。感受一下:'remove(someIndex)' 和 'remove(at: index)' 之间的区别
  • 嘿@Igor B,感谢您的评论!我可能是非常错误的,因为我不是母语人士和 Swift 新手,但据我了解 Swift API 设计指南,我认为“当第一个参数形式介词短语的一部分,给它一个参数标签。”规则适用于func remove(at index: Int) -&gt; Element函数和“否则,如果第一个参数构成语法短语的一部分,则省略其标签" 规则适用于mutating func remove(_ object: Element) 函数。 :)
  • @0x5f3759df 抱歉回复晚了。你的英语很好。顺便说一句,我也不是母语人士 :) 您对 Swift API 设计指南的理解与我的相同。根据它不需要“对象”标签。但是由于还有另一种删除方法,它在特定索引处删除项目,我更喜欢为参数保留“对象”标签。在索引数组的情况下,由于可能的混淆,我们可能会遇到错误。我认为这种情况要打破常规。实际上,在我看来,该指南只是一组建议,如果需要我们可以忽略。
  • 嗨@IgorB,我明白你的意思。只是为了提供帮助:Set's remove element functionmutating func remove(_ member: Element) 函数也按照我描述的方式遵循“Swift API 设计指南”。 remove(at index: Int)remove(_ member: Element) 之间的区别在于前者删除了索引 at 的元素,而后者删除了成员。话虽如此,我同意你的观点应该比我的更重要!感谢您的时间,感谢它。 :)
猜你喜欢
  • 2017-10-05
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多