如何在Swift中对结构体数组进行排序

30

我有一个结构体数组,想用sort()函数按照其中的两个变量之一进行排序

struct{
    var deadline = 0
    var priority = 0
}

我查看了Swift编程语言的文档中的sort()函数,但它只展示了简单数组。sort()能否使用,还是我需要自己构建?


2个回答

68

在同一数组变量中进行排序

下面这些排序函数完全相同,唯一的区别是它们有多简短和表意清晰:

完整声明:

myArr.sort { (lhs: EntryStruct, rhs: EntryStruct) -> Bool in
    // you can have additional code here
    return lhs.deadline < rhs.deadline
}

缩短的闭包声明:

myArr.sort { (lhs:EntryStruct, rhs:EntryStruct) in
    return lhs.deadline < rhs.deadline
}
// ... or even:
myArr.sort { (lhs, rhs) in return lhs.deadline < rhs.deadline }
紧致闭包声明:
myArr.sort { $0.deadline < $1.deadline }

将排序的结果存储在一个新数组变量中

完整声明:

let newArr = myArr.sorted { (lhs: EntryStruct, rhs: EntryStruct) -> Bool in
    // you can have additional code here
    return lhs.deadline < rhs.deadline
}

缩短的闭包声明:

let newArr = myArr.sorted { (lhs:EntryStruct, rhs:EntryStruct) in
    return lhs.deadline < rhs.deadline
}
// ... or even:
let newArr = myArr.sorted { (lhs, rhs) in return lhs.deadline < rhs.deadline }

紧致闭包声明:

let newArr = myArr.sorted { $0.deadline < $1.deadline }

0
如果您需要按可比属性进行排序,请检查SortComparator协议是否可以使您的操作更简单。适用于(macOS 12+,iOS 15+)。
struct Task {
    static var samples: [Self] = (0...5).map{ _ in .init() }
    var deadline = Int.random(in: 0...20)
    var priority = Int.random(in: 0...20)
}

Task.samples.sort(using: [
    KeyPathComparator(\.deadline, order: .forward),
    KeyPathComparator(\.priority, order: .reverse),
])

print(Task.samples)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接