Creuser dans la programmation fonctionnelle et rapide dans l'ensemble, je suis submergé par de multiples façons de faire les choses. Dans ce cas, j'aimerais avoir struct
qui adopte Comparable
mais qui peut conditionnellement changer quelles propriétés sont utilisées dans les opérateurs surchargés.Comment basculer de manière conditionnelle entre les implémentations de méthodes d'extension de protocole?
Disons que je suit, un tri rapide (du didacticiel Wenderlich FP Niv Yahel), étendant une gamme comparable, qui facilement accueillir mon Collection
de Student
s
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()
Mais, ce que je voudrais que une prochaine étape est de décider à la volée où la structure sera triée par, soit le nom, les grades, ou l'âge, de préférence sans avoir à toucher cette belle fonction de quicksort.
- Faut-il transformer le tri rapide en une fonction générique?
- Devrais-je examiner les contraintes de type?
- Devrais-je avoir une propriété dans Student qui est une énumération de la propriété sur laquelle elle devrait trier? Semble moche.
- Dois-je avoir un quickSorted qui est quelque chose comme
quickSorted(by: .name)
? Il ne semblera plus bien s'appliquer à une extension de tableau.