2017-10-06 50 views
0

我想要创建一个通用函数来根据传递的属性对类的数组进行排序。按属性排序类的数组的通用函数

例如,我有这些类

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(制造商))

谢谢!

+0

您可以在'sort()'方法中将属性名称作为字符串传递。然后在你的课堂上添加这个:https://stackoverflow.com/a/24919834/6638533 – samAlvin

+1

@samAlvin他问的是Swift,而不是C#。 – Alexander

+0

@亚历山大哎呦我的坏,我应该在将来更加小心 – samAlvin

回答

1

在这里你去:

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)}) 
} 
+0

谢谢@Sweeper – avrospirit

1

与斯威夫特4开始,你可以定义排序方法这需要 a Key-Path Expression作为参数:

extension Array { 
    mutating func sort<T: Comparable>(byKeyPath keyPath: KeyPath<Element, T>) { 
     sort(by: { $0[keyPath: keyPath] < $1[keyPath: keyPath] }) 
    } 
} 

实例:

persons.sort(byKeyPath: \.name) 
cars.sort(byKeyPath: \.manufacturer) 

有关键路径表达式的更多信息,请参见SE-0161 Smart KeyPaths: Better Key-Value Coding for Swift

+0

感谢@Martin。 – avrospirit