gpt4 book ai didi

ios - 当集合在 swift 中存储用户定义的类型时,如何以特定顺序迭代集合的值?

转载 作者:行者123 更新时间:2023-11-29 00:45:47 24 4
gpt4 key购买 nike

所以从 Swift 的文档中,我知道:

Swift’s Set type does not have a defined ordering. To iterate over the values of a set in a specific order, use the sort() method, which returns the set’s elements as an array sorted using the < operator.

我可以理解迭代时原始数据类型的排序是如何工作的,但是有什么方法可以使用户定义的类型成为可能吗?假设我有一个名为 Foo 的类,它符合 hashable 协议(protocol)(我不确定它是否应该是一个要求)。假设 Foo 有两个属性,IDUsername

可行吗?如果是,我怎样才能让它发挥作用?

最佳答案

因此,假设您的 Foo 是这样的:(Swift 2 代码)

class Foo: Hashable, CustomStringConvertible { // Hashable is mandatory to be a Swift Set element.
var id: Int
var username: String

init(id: Int, username: String) {
self.id = id
self.username = username
}

//To conform to `Hashable`
var hashValue: Int {
return id.hashValue &+ username.hashValue
}

//useful for debugging
var description: String {
return "id: \(id), username: \(username)"
}
}
//Also, to conform to `Hashable`
func == (lhs: Foo, rhs: Foo) -> Bool {
return lhs.id == rhs.id && lhs.username == rhs.username
}

制作一个示例:

let mySet: Set<Foo> = [
Foo(id: 1, username: "Man"),
Foo(id: 2, username: "Seven"),
Foo(id: 3, username: "Jack"),
Foo(id: 4, username: "Ace"),
Foo(id: 5, username: "Taro"),
]

迭代按id排序:

for f in mySet.sort({$0.id < $1.id}) {
print(f)
}

输出:

id: 1, username: Man
id: 2, username: Seven
id: 3, username: Jack
id: 4, username: Ace
id: 5, username: Taro

迭代按用户名排序:

for f in mySet.sort({$0.username < $1.username}) {
print(f)
}

输出:

id: 4, username: Ace
id: 3, username: Jack
id: 1, username: Man
id: 2, username: Seven
id: 5, username: Taro

您可以使用任何其他Comparable 属性编写类似的代码。您可以找到许多关于对Array进行排序的文章,Set可以以几乎相同的方式进行排序。

关于ios - 当集合在 swift 中存储用户定义的类型时,如何以特定顺序迭代集合的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38600271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com