【发布时间】:2015-05-10 10:13:10
【问题描述】:
在 Objective-C 中,您可以轻松地将包含 NSArray 对象的 NSSet 对象初始化为元素。借助 isEqual: 方法,您可以轻松比较那些 NSSet 对象。
现在在强类型化的 Swift 中,我们不能再这样做了。以下声明将收到“类型 [Int] 不符合协议 Hashable”错误。
var set: Set<[Int]>
我现在正在尝试比较包含一堆 Int 数字的两组数组的相等性,我想利用 Swift 中的 Set 和 Array 的“isEqual:”思想,我该怎么办?
【问题讨论】:
-
好吧,我想,只需创建一个数组扩展名并将其设为
Hashable,但由于这需要var hashValue,因此遗憾的是,它无法在另一个模块中定义。 -
不正确,
hashValue也可以是计算属性,可以毫无问题地添加到扩展中。 -
@DavideDeFranceschi 可以,但是
hashValue需要声明为public,不能在扩展中添加。 -
extension NSArray: Equatable {} public func ==(lhs: NSArray, rhs: NSArray) -> Bool { return lhs.isEqualToArray(rhs as [AnyObject]) } extension NSArray: Hashable { var hashable: Int { return 1 } } let fooSet: Set<NSArray> = [NSArray(array: [1, 2])] fooSet.dynamicType这在我的操场上编译(抱歉无法在 cmets 中格式化长代码?)
标签: ios objective-c swift cocoa-touch foundation