Почему «Set» работает иначе на Swift Playground? - PullRequest
2 голосов
/ 18 июня 2020

Если я запускаю следующий код на игровой площадке Swift, он работает должным образом. То есть «равноправный» объект добавляется только один раз, и вызывается оператор «==». Однако, если я вставляю код в приложение, он добавляет объект дважды. Я так понимаю, мне не хватает чего-то очевидного.

Xcode 11.5, Swift версии 5.2.4.

Любая помощь приветствуется.

struct Object: Equatable, Hashable {
    let name: String
    let completed: Bool  
    static func == (lhs: Object, rhs: Object) -> Bool {
        // Comparison operator called only in playground
        print("Comparing \(lhs.name) == \(rhs.name)")
        return lhs.name == rhs.name
    }
    public func hash(into hasher: inout Hasher) {
        hasher.combine(name)
    }
}
let firstObject = Object(name: "apples", completed: false)
let secondObject = Object(name: "apples", completed: true)
var set = Set<Object>()
set.insert(firstObject)
// set.insert(secondObject) // Adds "duplicate" object
set.update(with: secondObject) // Also adds "duplicate" object
print(set) // Why are two "equal" objects added to the set?

Вывод на игровую площадку:

Comparing apples == apples
[__lldb_expr_5.Object(name: "apples", completed: true)]

Вывод приложения:

[settest.ViewController.(unknown context at $106fd87bc).(unknown context at $106fd8808).Object(name: "apples", completed: false), settest.ViewController.(unknown context at $106fd87bc).(unknown context at $106fd8808).Object(name: "apples", completed: true)]

Кроме того, если я добавлю дополнительные свойства или изменю Bool на String, результат будет таким же.

...