如何對要按宣告順序排序的列舉陣列進行排序?
enum EducationOptions: String {
case gcse = "GCSE"
case aLevel = "A Level"
case bachelors = "Bachelors"
case masters = "Masters"
case doctorate = "Doctorate"
case other = "Other"
}
var arrayOfEducationOptions: [EducationOptions] = [.masters, .gcse, .aLevel]
我想按照列舉中宣告的順序對 arrayOfEducationOptions 進行排序以獲取 [.gcse, .aLevel, .masters]
uj5u.com熱心網友回復:
使其符合CaseIterable協議并使用靜態allCases屬性:
enum EducationOptions: String, CaseIterable {
case gcse = "GCSE"
case aLevel = "A Level"
case bachelors = "Bachelors"
case masters = "Masters"
case doctorate = "Doctorate"
case other = "Other"
}
let arrayOfEducationOptions = EducationOptions.allCases
uj5u.com熱心網友回復:
看起來 Vadim 的想法是正確的,但如果你想對 EducationOptions 的任意串列進行排序,你可以使用如下代碼:
enum EducationOptions: String, CaseIterable {
case gcse = "GCSE"
case aLevel = "A Level"
case bachelors = "Bachelors"
case masters = "Masters"
case doctorate = "Doctorate"
case other = "Other"
}
let allCases = EducationOptions.allCases
var arrayOfEducationOptions: [EducationOptions] = [.masters, .gcse, .aLevel]
.sorted {allCases.firstIndex(of: $0)! < allCases.firstIndex(of: $1)! }
arrayOfEducationOptions.forEach { print($0) }
請注意,該代碼是一個幼稚的實作,并且隨著案例數量的增加,擴展性會很差。(它至少會有時間性能,甚至可能O(n2)更糟(O(n2?log n)
uj5u.com熱心網友回復:
向列舉添加可比較的協議?
enum EducationOptions: String {
case gcse = "GCSE"
case aLevel = "A Level"
case bachelors = "Bachelors"
case masters = "Masters"
case doctorate = "Doctorate"
case other = "Other"
var order: Int {
switch self {
case .gcse: return 1
case .aLevel: return 2
case .bachelors: return 3
case .masters: return 4
case .doctorate: return 5
case .other: return 6
}
}
extention EquctionOptions: Comparable {
static func < (lhs: EducationOptions, rhs: EducationOptions) -> Bool {
lhs.order < rhs.order
}
}
然后你可以對陣列進行排序。
let array = [.masters, .gcse, .aLevel]
let sorted = array.sorted(by: { $0 < $1 })
可能有更好的方法來設定陣列中的順序值,同時也具有字串原始值,但不是我的頭頂
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/477490.html
