【问题标题】:What must you do to have set operations work on custom objects?您必须做什么才能使集合操作对自定义对象起作用?
【发布时间】:2015-10-10 17:34:37
【问题描述】:

我做了一个小操场,对自定义对象的 Set 操作进行了一些测试,但它们仍然失败,我不知道为什么。

class User: NSObject {
    let id: String
    init(id: String) {
        self.id = id
        super.init()
    }

    override var hashValue: Int {
        get {
            return id.hashValue
        }
    }

    override var description: String {
        get {
            return id
        }
    }
}


func ==(lhs: User, rhs: User) -> Bool {
    return lhs.hashValue == rhs.hashValue
}

然后,我做了两组User对象:

let user1 = User(id: "zach")
let user2 = User(id: "john")
let user3 = User(id: "shane")


let user4 = User(id: "john")
let user5 = User(id: "shane")
let user6 = User(id: "anthony")

let userSet1 : Set<User> = [user1, user2, user3]
let userSet2 : Set<User> = [user4, user5, user6]

但是当我做这样的操作时:

let newSet = userSet1.subtract(userSet2)
print(newSet)

newSetuserSet1 相同,并且没有任何集合被修改。

我必须做什么才能使这些集合操作起作用?

id:zach -> 4799450060450308971
id:john -> 4799450060152454338
id:shane -> -4799450060637667915
id:john -> 4799450060152454338
id:shane -> -4799450060637667915
id:anthony -> 4799450059843449897
id:shane -> -4799450060637667915
id:anthony -> 4799450059843449897
id:john -> 4799450060152454338

【问题讨论】:

  • 提示:在返回之前登录NSString(string: id).integerValue,看看你是否成功满足哈希性要求。
  • 但是根据我的hashValue,他们确实有共同的成员
  • 我更新了hashValue 计算并添加了一些打印,您可以看到其中一些匹配hashValues,但操作仍然无法正常工作
  • 到达那里。但散列值并不是散列性的唯一要求。对哈希性有什么要求?有一个简单的规则,你仍然没有遵守它。

标签: ios swift set


【解决方案1】:

您无法自行决定将什么用作哈希值。哈希性的要求是:如果两个对象相等,则两个对象的哈希值必须相同

您提供了一个哈希值算法,但您没有做任何事情来使您的用户对象的等价性匹配它。

这是一个在集合中可散列的用户对象:

func ==(lhs:User, rhs:User) -> Bool {
    return lhs.id == rhs.id
}
class User: Hashable, CustomStringConvertible {
    let id: String
    init(id: String) {
        self.id = id
    }
    var hashValue: Int {
        return id.hashValue
    }
}

请注意,我已经消除了使这个东西也成为 NSObject 的复杂性。如果您想这样做,情况会有所不同;您需要考虑 NSObject 是如何工作的。

【讨论】:

  • 哇!这行得通,我感兴趣的一件事是如果UserNSObject 子类,那么必须做什么
  • 然后阅读 NSObject 上的文档。 == 是斯威夫特;它不会使 NSObjects 相等。 NSObject 有hash,而不是hashValue
  • 非常感谢!我查看了 NSObject 文档,发现您需要覆盖 hashisEqual,我让它作为 NSObject 子类工作
猜你喜欢
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
相关资源
最近更新 更多