使用结构作为NSDictionary的键

Ole*_*leg 0 xcode cocoa-touch ios swift

我正在尝试使用struct一个键作为键NSDictionary.根据文档,它必须符合Hashable协议.
我这样做,但我得到一个错误DateRange不符合协议Hashable和Equatable.我该如何解决这个问题?
这是我的代码:

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

    var endDate: NSDate {
        return self.endDate.timeIntervalSince1970.hashValue
    }
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*nio 5

该Hashable协议具有必须在结构中实现的必需属性:

var hashValue: Int { get }
Run Code Online (Sandbox Code Playgroud)

实现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
}
Run Code Online (Sandbox Code Playgroud)

为了计算哈希,我使用了startDate哈希值加上endDate哈希乘以37(素数)的总和.此解决方案不考虑溢出,您应该注意防止运行时错误.