泛型函数根据属性对类的数组进行排序 [英] Generic function to sort array of class by properties

查看:85
本文介绍了泛型函数根据属性对类的数组进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



例如,我有这些类

  public class Car {
var id:Int
var制造商:字符串
var变量:字符串

init(id:Int,manufacturer:String,variant:String){
self.id = id
self.manufacturer =制造商
self.variant =变量
}
}

enum性别{b $ b案例男性
案例女性
}

公共类人员{
var id:Int
var name:String
var age:Int
var性别:Gender

init(id:Int,name:String,age:Int,性别:性别){
self.id = id
self.name =姓名
self.age =年龄
self.gender =性别
}
}

而这些数组,

  let cars = [
Car(id:1,manufa汽车(编号:2,制造商:日产,变体:天际线),
汽车(id:3,制造商:道奇 ,变型:充电器),
汽车(id:4,制造商:雪佛兰,变体:Camaro),
汽车(id:5,制造商:福特 Shelby)
]

let persons = [
Person(id:1,name:Ed Sheeran,年龄:26,性别:男),
Person(id:2,姓名:Phil Collins,年龄:66,性别:.male),
Person(id:3,姓名:夏奇拉,年龄:40,性别: ,
Person(id:4,name:Rihanna,年龄:25,性别:.female),
Person(id:5,name:Bono,年龄:57,性别:男)
]

如何为数组写一个通用扩展,关于财产传递? (例如persons.sort(姓名)或cars.sort(制造商))

谢谢!

解决方案



 扩展数组{
mutating func propertySort< T:比较>(_财产:(元素) - > T){
sort(by:{property($ 0)< property($ 1)})
}
}

用法:

  persons.propertySort({$ 0.name})

这里是一个非变异版本:

  func propertySorted< T:Comparable>(_ property:(Element) - > T) - > [元素] {
返回排序(通过:{property($ 0)< property($ 1)})
}


I want to create a generic function to sort an array of classes based on a property passed.

For example, I have these classes

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
    }
}

And these arrays,

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)
]

How to write a generic extension for the array, to sort it based on the property passed? (eg. persons.sort(name) or cars.sort(manufacturer))

Thanks!

解决方案

Here you go:

extension Array {
    mutating func propertySort<T: Comparable>(_ property: (Element) -> T) {
        sort(by: { property($0) < property($1) })
    }
}

Usage:

persons.propertySort({$0.name})

And here is a non-mutating version:

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

这篇关于泛型函数根据属性对类的数组进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆