Swift 3: Как написать экватируемый функционал
2 ответа
Любой тип Swift, соответствующий протоколу Hashable, также должен соответствовать протоколу Equatable. Потому что Hashable протокол наследуется от Equatable protocol (source). Вот почему вы получаете это сообщение об ошибке.
Что касается вашего вопроса, функция == должна быть объявлена глобально, поскольку вы переопределяете глобальный оператор ==, чтобы иметь возможность сравнивать два атрибута, которые вы определили. В Swift 3 вы также можете определить == в самой структуре, но она должна быть статической.
struct Attributes: Hashable {
var uid: Int
var size: Size
var mimeType: mimeType
var hashValue: Int {
return uid
}
static func ==(lhs: Attributes, rhs: Attributes) -> Bool {
return lhs.size == rhs.size && lhs.mimeType == rhs.mimeType
}
}
Дело не в версии Swift. Это также даст ошибку на Swift 2. Проблема в том, что вы должны определить ==
функции вне структуры, потому что это должна быть глобальная функция.