Swift 3: Как написать экватируемый функционал

Я пытаюсь использовать структуру в качестве моего ключа для словаря.

Код работает для swift 2Однако не для 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. Проблема в том, что вы должны определить == функции вне структуры, потому что это должна быть глобальная функция.

Другие вопросы по тегам