我有两个NSCountedSets,需要减go 它们.为了清晰起见,我使用一个简单的 struct ,其中一个属性作为对象:

struct MyStruct {
    let name: String
    
    init(_ name: String) {
        self.name = name
    }
}

func subtract(_ set1: NSCountedSet, _ set2: NSCountedSet) -> NSCountedSet {
    var result = NSCountedSet()

    for e in set1 {
        let count1 = set1.count(for: e)
        let count2 = set2.count(for: e)
        let newCount = count1 - count2

        if newCount > 0 {
            for _ in 1 ... newCount {
                result.add(e)
            }
        }
    }

    return result
}

let set1 = NSCountedSet(array: [MyStruct("A"), MyStruct("A"), MyStruct("A"), MyStruct("B"), MyStruct("C"), MyStruct("C")])
let set2 = NSCountedSet(array: [MyStruct("A"), MyStruct("B"), MyStruct("C")])

let set3 = subtract(set1, set2) // expected result: ["A", "A", "C"]`

print(set3.count(for: MyStruct("A"))) // observed result: 0 (expected 2)
print(set3.count(for: MyStruct("B"))) // observed result: 0 (expected 0)
print(set3.count(for: MyStruct("C"))) // observed result: 0 (expected 1)

但是,如果我使用:

let set1 = NSCountedSet(array: ["A", "A", "A", "B", "C", "C"])
let set2 = NSCountedSet(array: ["A", "B", "C"])

我得到了预期的结果.

我怀疑每MyStruct("A")个ETC实际上并不等于其他的ETC,因为它们是重新创建的.这就是我在添加print语句时看到的,count1始终为1,count2始终为0

所以也许有一种方法,我可以通过判断name的属性来计算MyStruct的数量,这可能吗?

如果没有,有没有其他解决办法?

推荐答案

您需要使您的类型符合Hashable,才能使NSCountedSet基于其属性比较其元素.

struct MyStruct: Hashable {
  let name: String

  init(_ name: String) {
    self.name = name
  }
}

也不需要定义subtract方法,NSCountedSet已经从它的NSMutableSet超类继承了minus

set1.minus(Set(_immutableCocoaSet: set2))

请注意,minus会改变它所调用的集合,而不是返回一个新的实例.

如果要声明minus的非Mutations 变量,而不必重新实现其逻辑,只需复制集合,在副本上调用minus即可.

extension NSMutableSet {
  func subtracting(_ other: NSMutableSet) -> NSMutableSet {
    let copy = self.mutableCopy() as! NSMutableSet
    copy.minus(.init(_immutableCocoaSet: other))
    return copy
  }
}

let subtracted = set1.subtracting(set2)

Swift相关问答推荐

向文本元素添加背景色失败

.onReceive NSWindow.CloseNotify是否会为App中的每个窗口调用?

在SwiftUI中判断选项时避免重复查看

SWIFT:使字典数组值可变

与视图交互使工具栏&;标题消失

BLE 在 ESP32 和 Iphone 之间发送字符串

为什么 UITapGestureRecognizer 对于 Swift 集合视图中的单元格图像无法正常工作?

SwiftUI:按钮的圆形边缘的边框尺寸加倍

SwiftUI 从任务中安全更新状态变量

如何使用 Swinject 注册符合 ObservableObject 的协议?

如何让 UIKit 挤压你的视图,使其适合屏幕

将项目引用添加到 Swift iOS XCode 项目并调试

在 ViewController 的 UICollectionView 中拉取刷新

Swift:在子类中覆盖 == 导致仅在超类中调用 ==

swift : 具有类型和值的枚举常量

Swift 中的 PageViewController 当前页面索引

为什么'nil' 与 Swift 3 中的 'UnsafePointer' 不兼容?

如何在 Swift 中使用 Crashlytics 登录?

Objective-C 方法与可选需求方法 Swift 冲突

UITableView 布局在 push segue 和 return 上搞砸了. (iOS 8、Xcode beta 5、Swift)