在我的代码中,我有一个类似以下的结构:
struct Object {
var name: String
var count: Int
我现在正在创建10个具有随机名称和随机计数的对象的数组。
有没有一种简单的方法可以
a)按字母顺序对其进行排序
b)按升序对其进行数字排序
基本上,将有像这样的数组:[Object1, Object2, Object3]
。每个对象都有一个name
andcount
属性,我希望通过这两个属性对该列表中的对象进行排序。
Swift2中的解决方案(使用以下解决方案:StackOverflow):
Object.sort{
if $0.name != $1.name {
return $0.name < $1.name
}
else {
//suits are the same
return $0.count < $1.count
}
}
但是,它已sorted(by: )
在Swift3中重命名为,我不放弃如何做。
如果要按字母顺序然后按数字顺序排序,可以:
var array = ["A2", "B7", "A4", "C3", "A1", "A10"]
array.sort { $0.compare($1, options: .numeric) == .orderedAscending }
产生:
[“ A1”,“ A2”,“ A4”,“ A10”,“ B7”,“ C3”]
我添加A10
到您的数组中,因为没有它,简单的字母排序就足够了。但是我假设您想要A10
after A4
,在这种情况下,数字比较将为您完成工作。
您已将示例更改为具有两个属性的结构。在这种情况下,您可以执行以下操作:
struct Foo {
var name: String
var count: Int
}
var array = [
Foo(name:"A", count: 2),
Foo(name:"B", count: 7),
Foo(name:"A", count: 7),
Foo(name:"C", count: 3),
Foo(name:"A", count: 1),
Foo(name:"A", count: 10)
]
array.sort { (object1, object2) -> Bool in
if object1.name == object2.name {
return object1.count < object2.count
} else {
return object1.name < object2.name
}
}
或者,更简洁地说:
array.sort { $0.name == $1.name ? $0.count < $1.count : $0.name < $1.name }
要么
array.sort { ($0.name, $0.count) < ($1.name, $1.count) }
注意,不是将这种逻辑放在闭包中,而是实际上使Foo
符合Comparable
:
struct Foo {
var name: String
var count: Int
}
extension Foo: Equatable {
static func ==(lhs: Foo, rhs: Foo) -> Bool {
return (lhs.name, lhs.count) == (rhs.name, rhs.count)
}
}
extension Foo: Comparable {
static func <(lhs: Foo, rhs: Foo) -> Bool {
return (lhs.name, lhs.count) < (rhs.name, rhs.count)
}
}
这样可以使比较逻辑很好地封装在Foo
它所属的类型中。
然后,您可以按照以下步骤进行排序:
var array = ...
array.sort()
或者,如果不想对原始数组进行排序,则可以返回一个新数组:
let array = ...
let sortedArray = array.sorted()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句