Swift排序方法
在 Swift 中,排序使用的是标准库方法,比如 sort() 和 sorted()。以下是一些常见的排序方法和技巧:
1、sort() 与 sorted() 的区别
sorted():生成排序后的新数组,不改变原数组。
sort():对原数组进行排序,直接修改原数组。
示例:
var numbers = [3, 1, 4, 1, 5, 9]
let sortedNumbers = numbers.sorted() // [1, 1, 3, 4, 5, 9]
print(numbers) // [3, 1, 4, 1, 5, 9] (原数组未改变)
numbers.sort() // [1, 1, 3, 4, 5, 9]
print(numbers) // [1, 1, 3, 4, 5, 9] (原数组已排序)
2、升序和降序排序
使用闭包提供排序规则。
升序:
let numbers = [3, 1, 4, 1, 5, 9]
let ascending = numbers.sorted(by: <) // [1, 1, 3, 4, 5, 9]
降序:
let numbers = [3, 1, 4, 1, 5, 9]
let descending = numbers.sorted(by: >) // [9, 5, 4, 3, 1, 1]
3、对自定义对象排序
如果是自定义结构或类,可以通过指定排序规则进行排序。
示例:
struct Person {
let name: String
let age: Int
}
let people = [
Person(name: "Alice", age: 30),
Person(name: "Bob", age: 25),
Person(name: "Charlie", age: 35)
]
// 按年龄升序排序
let sortedByAge = people.sorted { $0.age < $1.age }
4、稳定排序
sort() 和 sorted() 是稳定排序,保持相等元素的原始顺序。
示例:
struct Item {
let value: Int
let order: Int
}
let items = [
Item(value: 3, order: 1),
Item(value: 1, order: 2),
Item(value: 3, order: 3)
]
let sortedItems = items.sorted { $0.value < $1.value }
// 排序后:[Item(value: 1, order: 2), Item(value: 3, order: 1), Item(value: 3, order: 3)]
5、组合排序条件
如果需要按照多个条件排序,可以嵌套排序规则。
示例:
struct Task {
let priority: Int
let deadline: Date
}
let tasks = [
Task(priority: 1, deadline: Date()),
Task(priority: 2, deadline: Date().addingTimeInterval(-100)),
Task(priority: 1, deadline: Date().addingTimeInterval(100))
]
// 先按优先级排序,再按截止日期排序
let sortedTasks = tasks.sorted {
if $0.priority == $1.priority {
return $0.deadline < $1.deadline
} else {
return $0.priority < $1.priority
}
}
6、高效排序(大数据集)
对于大数据集,可以通过使用 in-place 排序 (sort()) 减少内存开销。
示例:
var largeArray = (1...100_000).shuffled()
largeArray.sort() // 原地排序,效率更高
7、性能优化
避免重复排序:如果需要多次使用排序后的数组,考虑缓存结果。
自定义排序算法:对于复杂排序规则,可以实现自定义的排序逻辑。
示例:
var numbers = [3, 1, 4, 1, 5, 9]
numbers.sort { $0 % 2 == 0 && $1 % 2 != 0 } // 将偶数排在奇数前面
SwiftUI排序方法
在 SwiftUI 中,sort 通常结合 List 和 ForEach 来对显示的数据进行排序。以下是一些常见的使用场景和技巧。
1、静态数组排序
import SwiftUI
struct SortExampleView: View {
let numbers = [3, 1, 4, 1, 5, 9, 2, 6]
var body: some View {
List {
ForEach(numbers.sorted(), id: \.self) { number in
Text("\(number)")
}
}
}
}
#Preview {
SortExampleView()
}

上面的例子中,sorted() 方法对 numbers 按从小到大的顺序排序。
2、动态数据排序
对于动态数据,可以在 @State 或 @StateObject 中维护排序的逻辑。
import SwiftUI
struct DynamicSortView: View {
@State private var items = ["Banana", "Apple", "Cherry", "Date"]
@State private var isAscending = true
var body: some View {
VStack {
Toggle("Ascending Order", isOn: $isAscending.animation())
.padding()
List {
ForEach(items.sorted(by: isAscending ? (<) : (>)), id: \.self) { item in
Text(item)
}
}
}
}
}
#Preview {
DynamicSortView()
}

关键点:
使用 Toggle 来切换升序或降序。
使用 sorted(by:) 方法,根据条件动态排序。
3、对自定义对象排序
对于自定义类型,可以通过指定排序规则对数据进行排序。例如:
struct Person: Identifiable {
let id = UUID()
let name: String
let age: Int
}
struct SortCustomObjectView: View {
@State private var people = [
Person(name: "Alice", age: 30),
Person(name: "Bob", age: 25),
Person(name: "Charlie", age: 35)
]
var body: some View {
List {
ForEach(people.sorted(by: { $0.age < $1.age })) { person in
HStack {
Text(person.name)
Spacer()
Text("\(person.age)")
}
}
}
}
}
#Preview {
SortCustomObjectView()
}

关键点:
对 Person 对象按 age 进行升序排序。
使用 sorted(by:) 提供自定义排序规则。
4、排序并限制显示数量
如果想在排序的同时限制显示的数据数量,可以结合 prefix(_:) 使用:
struct LimitedSortView: View {
let numbers = [3, 1, 4, 1, 5, 9, 2, 6]
var body: some View {
List {
ForEach(numbers.sorted().prefix(5), id: \.self) { number in
Text("\(number)")
}
}
}
}
struct LimitedSortView_Previews: PreviewProvider {
static var previews: some View {
LimitedSortView()
}
}

此代码只显示排序后前 5 个元素。
5、排序的优化建议
大数据排序:如果数据量较大,建议在模型层或后端进行排序。
实时排序:可以在视图模型中使用 @Published 或 @StateObject 来实时更新排序后的数据。
组合排序:如果需要多个条件排序,可以将条件组合。
let sortedItems = items.sorted {
if $0.priority == $1.priority {
return $0.date < $1.date
} else {
return $0.priority > $1.priority
}
}
总结
简单排序:sort() 和 sorted() 适用于简单排序。
自定义规则:通过闭包实现更复杂的排序。
优化性能:大数据集排序时尽量使用原地排序。
相关文章
Swift In-place 排序(原地排序):https://fangjunyu.com/2025/01/14/swift-in-place-%e6%8e%92%e5%ba%8f%ef%bc%88%e5%8e%9f%e5%9c%b0%e6%8e%92%e5%ba%8f%ef%bc%89/