0
深入研究函數式編程和整體快速我被多種處理方式所淹沒。在這種情況下,我希望struct
採用Comparable
,但可以有條件地切換哪些屬性在重載操作符中使用。如何有條件地在協議擴展方法實現之間切換?
比方說,我有以下的,一個快速排序(從和合Yahel的Wenderlich FP教程),延長任何類似陣列,這將很容易適應我Collection
的Student
小號
struct Student {
let name: String
let age: Int
let grades: Double
}
extension Student: Comparable {
static func <(lhs: Student, rhs: Student) -> Bool {
return lhs.grades < rhs.grades
}
static func ==(lhs: Student, rhs: Student) -> Bool {
return lhs.grades == rhs.grades
}
}
extension Array where Element: Comparable {
func quickSorted() -> [Element] {
if self.count > 1 {
let (pivot, remaining) = (self[0], dropFirst())
let lhs = remaining.filter{ $0 <= pivot }
let rhs = remaining.filter{ $0 > pivot }
return lhs.quickSorted() as [Element] + pivot + rhs.quickSorted()
}
return self
}
}
}
//Omitted, create a bunch of Students
//let bingoLittle = Student(name: "BingoLittle", age: 23, grades: 93.4)
let myStudentDirectory = [bingoLittle, studentB, ... StudentN]
let sortedStudentDirectory = myStudentDirectory.quickSorted()
但是,我想什麼下一步是決定結構將按名稱,等級還是年齡排序,最好不用碰這個不錯的快速排序功能。
- quicksort應該變成一個通用函數嗎?
- 我應該看看類型限制嗎?
- 我應該在Student中擁有一個屬性,它應該排序哪個屬性的枚舉?看起來很醜。
- 我應該有一個類似於
quickSorted(by: .name)
的quickSorted?它似乎不太適用於數組擴展。