如果您想先按字母顺序再按数字排序,您可以:
var array = ["A2", "B7", "A4", "C3", "A1", "A10"]
array.sort { $0.compare($1, options: .numeric) == .orderedAscending }
这会产生:
[“A1”、“A2”、“A4”、“A10”、“B7”、“C3”]
I added 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 }
Or
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()