2015-02-04 4 views
0

Я пытаюсь использовать struct в качестве ключа в NSDictionary. Согласно документации, он должен соответствовать протоколу Hashable.
Я сделал это, но получаю сообщение об ошибке DateRange не соответствует протоколам Hashable и Equatable. Как я могу это исправить?
Вот мой код:Использование структуры в качестве ключа для NSDictionary

struct DateRange: Hashable { 
    var startDate: NSDate { 
     return self.startDate.timeIntervalSince1970.hashValue 
    } 

    var endDate: NSDate { 
     return self.endDate.timeIntervalSince1970.hashValue 
    } 
} 

ответ

5

Hashable Протокола имеет требуемое свойство, что вы должны реализовать в вашей структуре:

var hashValue: Int { get } 

Реализация hashable протокола не означает, что делает его свойство hashable - это вся структура, которая должна раскрывать вышеприведенное свойство, где возвращаемое значение в идеале должно быть уникальным и, конечно, в зависимости от внутреннего состояния.

Заметим, что протокол Hashable требует протокола Equatable, который также должен быть реализован. Пример:

struct DateRange: Hashable, Equatable { 
    var startDate: NSDate 
    var endDate: NSDate 

    var hashValue: Int { 
     return self.startDate.hashValue + 37 * self.endDate.hashValue 
    } 
} 

func == (lhs: DateRange, rhs: DateRange) -> Bool { 
    return lhs.startDate == rhs.startDate && lhs.endDate == rhs.endDate 
} 

Для вычисления хэш я использовал сумму стоимости startDate хэша-плюс endDate хэш, умноженного на 37 (простое число). Это решение не учитывает переполнения, что вы должны позаботиться о предотвращении ошибок времени выполнения.

+0

Не могли бы вы написать рабочий пример? Я получаю кучу ошибок при реализации функции-компаратора – Oleg

+0

@Oleg см. Обновленный ответ – Antonio

+0

В конце концов, моя проблема заключалась в том, что я объявила структуру внутри класса :) Но ваш ответ работает отлично! – Oleg

1

В дополнении к @ ответу Антонио, here «s ссылки объяснения Hashableпротокола довольно красиво.

Смежные вопросы