我试图用struct作为NSDictionary中的键。根据文件,它必须符合Hashable协议。
我做到了,但是我得到了一个错误DateRange不符合协议HashableEquatable。我该怎么解决?
这是我的代码:

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

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

最佳答案

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(质数)的和。此解决方案不考虑溢出,您应该注意防止运行时错误。

10-07 21:07