【问题标题】:Append unique values to an array in swift快速将唯一值附加到数组中
【发布时间】:2015-11-13 11:19:05
【问题描述】:

我在 Swift 中没有找到任何关于它的内容。已经找到了如何在数组上找到唯一值,但不是这个。对不起,如果这听起来很基本......

但我有以下数组

var selectedValues = [String]()

以及来自 Parse 查询的以下值

 var objectToAppend = object.objectForKey("description")! as! String

这就是我目前的做法。

self.selectedHobbies.append(objectToAppend)

但是由于查询重复发生多次,它最终会附加重复的值。它有效,但我只想不浪费内存,只保留唯一值。

关于如何快速解决这个问题的任何想法?

【问题讨论】:

    标签: arrays swift append


    【解决方案1】:

    您可以使用保证唯一值的Set

    var selectedValues = Set<String>()
    // ...
    selectedValues.insert(newString) // will do nothing if value exists
    

    当然,Set 的元素是无序的。

    如果您想保留订单,请继续使用Array,但在插入之前请检查。

    if !selectedValues.contains("Bar") { selectedValues.append("Bar") }
    

    【讨论】:

    • 是否可以保留您的代码语法但使用[String] 而不是Set&lt;String&gt;Set&lt;String&gt; 对我没有多大用处,因为我可以将其转换为 [String]。我尝试了很多,但运气不佳。
    • @Mundi 您不需要进行contains 检查。如果您insert 并且该元素已经存在,则不会发生任何事情。
    • @Alexander 同意。改了。
    • 您也可以忽略放入数组中的内容,仅在需要唯一值时使用 .unique。在某些情况下,这可能更可取,例如,如果唯一检查成本高昂,而保存数据又不是。
    【解决方案2】:

    我猜你的问题已经解决了,但我会为下一个面临同样问题的开发人员添加我的答案:)

    我的解决方案是编写 Array 的扩展,以一种不同的方式从数组中添加元素:

    这里是代码:

    extension Array{
        public mutating func appendDistinct<S>(contentsOf newElements: S, where condition:@escaping (Element, Element) -> Bool) where S : Sequence, Element == S.Element {
          newElements.forEach { (item) in
            if !(self.contains(where: { (selfItem) -> Bool in
                return !condition(selfItem, item)
            })) {
                self.append(item)
            }
        }
      }
    }
    

    示例:

    var accounts: [Account]
    let arrayToAppend: [Account]
    accounts.appendDistinct(contentsOf: arrayToAppend, where: { (account1, account2) -> Bool in
            return account1.number != account2.number
    })
    

    【讨论】:

      猜你喜欢
      • 2019-11-20
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      相关资源
      最近更新 更多