我创建了这个单例以访问整个应用程序中的共享阵列:
class TranslationItems {
var delegate: TranslationItemsDelegate?
static let shared = TranslationItems()
var array = [Translation]() {
didSet {
delegate?.newItemAdded()
}
}
}
问题在于这允许重复(数组可能包含具有相同hashValue的多个项目)。如果我在didSet
设置器中检查是否有重复,然后在那里更改数组(例如,通过执行array = Array(Set(array))
),这将导致无限循环。
如何删除课程中的重复项?
答案 0 :(得分:3)
如果要避免重复,为什么不使用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
是不必要的。
答案 1 :(得分:2)
您可以按照建议进行操作。这不会导致无限循环
didSet {
array = Array(Set(array))
...
}
答案 2 :(得分:1)
只需添加一个实例方法
class TranslationItems {
var delegate: TranslationItemsDelegate?
static let shared = TranslationItems()
private(set) var array = [Translation]() {
didSet {
delegate?.newItemAdded()
}
}
func set(array:[Translation]) {
self.array = Array(Set(array))
}
}