In funktionale Programmierung und swift overall Ich bin überwältigt von mehreren Möglichkeiten, Dinge zu tun. In diesem Fall möchte ich struct
haben, das Comparable
annimmt, aber kann bedingt schalten, welche Eigenschaften in den überladenen Operatoren verwendet werden.Wie wird zwischen Implementierungen der Protokollerweiterungsmethode bedingt umgeschaltet?
Lassen Sie uns sagen, dass ich die folgende, einen quicksort (von Niv Yahel des Wenderlich FP-Tutorial), eine vergleichbare Anordnung erstrecken, die leicht meine Collection
von 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()
beherbergen wird aber, was ich möchte Ein nächster Schritt ist die Entscheidung, ob die Struktur nach Namen, Noten oder Alter sortiert wird, vorzugsweise ohne diese nette Quicksort-Funktion zu berühren.
- Sollte Quicksort in eine generische Funktion umgewandelt werden?
- Sollte ich Typ Einschränkungen betrachten?
- Sollte ich eine Eigenschaft in Student haben, die eine enum welcher Eigenschaft sollte es sortieren? Scheint hässlich.
- Sollte ich eine QuickSorte haben, die so ähnlich ist wie
quickSorted(by: .name)
? Es scheint nicht mehr gut zu einer Array-Erweiterung zu passen.