Swift和SwiftUI排序方法sort
Swift和SwiftUI排序方法sort

Swift和SwiftUI排序方法sort

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/

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注