2017-10-06 45 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