【问题标题】:Comparing Sets with Arrays inside将集合与内部数组进行比较
【发布时间】: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) -&gt; Bool { return lhs.isEqualToArray(rhs as [AnyObject]) } extension NSArray: Hashable { var hashable: Int { return 1 } } let fooSet: Set&lt;NSArray&gt; = [NSArray(array: [1, 2])] fooSet.dynamicType 这在我的操场上编译(抱歉无法在 cmets 中格式化长代码?)

标签: ios objective-c swift cocoa-touch foundation


【解决方案1】:

这里的问题是:为什么我不能用标准库做到这一点? Set 需要 Hashable 项目,这些项目也必须是 Equatable。这意味着执行 Set&lt;Array&lt;T&gt;&gt; 将需要 Any Array 检查与其他人是否相等。但是如果T 不是Equatable,你如何比较它们呢?不能(仍然?)声明条件扩展会导致这个:(

我认为你最好的选择(不要过多地与标准库上的扩展混淆)要么在 Swift 中使用 NSSet/NSArray,要么至少定义两个部分之一(Set 和 @987654331 @) 作为包装器。

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多