我想创建一个通用函数来根据传递的属性对类数组进行排序。
例如,我有这些课程
public class Car { var id: Int var manufacturer: String var variant: String init(id: Int, manufacturer: String, variant: String) { self.id = id self.manufacturer = manufacturer self.variant = variant } } enum Gender { case male case female } public class Person { var id: Int var name: String var age: Int var gender: Gender init(id: Int, name: String, age: Int, gender: Gender) { self.id = id self.name = name self.age = age self.gender = gender } }
这些数组
let cars = [ Car(id: 1, manufacturer: "Ford", variant: "Focus"), Car(id: 2, manufacturer: "Nissan", variant: "Skyline"), Car(id: 3, manufacturer: "Dodge", variant: "Charger"), Car(id: 4, manufacturer: "Chevrolet", variant: "Camaro"), Car(id: 5, manufacturer: "Ford", variant: "Shelby") ] let persons = [ Person(id: 1, name: "Ed Sheeran", age: 26, gender: .male), Person(id: 2, name: "Phil Collins", age: 66, gender: .male), Person(id: 3, name: "Shakira", age: 40, gender: .female), Person(id: 4, name: "Rihanna", age: 25, gender: .female), Person(id: 5, name: "Bono", age: 57, gender: .male) ]
如何为数组编写通用扩展名,以便根据传递的属性对其进行排序?(例如,persons.sort(名称)或cars.sort(制造商))
谢谢!
干得好:
extension Array { mutating func propertySort<T: Comparable>(_ property: (Element) -> T) { sort(by: { property($0) < property($1) }) } }
用法:
persons.propertySort({$0.name})
这是一个不变的版本:
func propertySorted<T: Comparable>(_ property: (Element) -> T) -> [Element] { return sorted(by: {property($0) < property($1)}) }
正如Leo Dabus指出的那样,您可以将扩展名概括MutableCollection为以下内容RandomAccessCollection:
MutableCollection
RandomAccessCollection
extension MutableCollection where Self : RandomAccessCollection { ...