2017-10-06 4 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) 
] 

がありますか? (例:person.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}) 

そして、ここでは、非変異バージョンです:スウィフト4以降で

func propertySorted<T: Comparable>(_ property: (Element) -> T) -> [Element] { 
    return sorted(by: {property($0) < property($1)}) 
} 
+0

ありがとう@スウィーパー – avrospirit

1

あなたはソート方法を定義することができますこれは、引数として と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

関連する問題