首页 > 解决方案 > 避免 Swift 数组中的重复

问题描述

我创建了这个单例来访问整个应用程序中的共享数组:

class TranslationItems {
    var delegate: TranslationItemsDelegate?

    static let shared = TranslationItems()

    var array = [Translation]() {
        didSet {
            delegate?.newItemAdded()
        }
    }
}

问题是这允许重复(数组可能包含具有相同 hashValue 的多个项目)。如果我检查didSetsetter 中的重复项,然后更改那里的数组(例如通过 do array = Array(Set(array))),这会导致无限循环。

如何删除班级中的重复项?

标签: swift

解决方案


如果你想避免重复,为什么不使用 Set (Translation必须符合Hashable)?

var set = Set<Translation>()

但是,如果要保持数组更有效的方法是添加add过滤重复项的方法,则Translation必须符合Equatable

func add(object: Translation) {
    if !array.contains(object) {
       array.append(object)
       delegate?.newItemAdded()
    }
}

Set从中制作一个Array然后将其转换回Array是不必要的昂贵。


推荐阅读