Swift 中按属性对类或结构数组进行排序的通用函数

2023-12-07

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

例如,我有这些课程

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(name) 或 cars.sort(manufacturer))

Thanks!


干得好:

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

Usage:

persons.propertySort({$0.name})

这是一个非变异版本:

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

正如 Leo Dabus 指出的,你可以将扩展推广到任何MutableCollection那也是一个RandomAccessCollection:

extension MutableCollection where Self : RandomAccessCollection {
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中按属性对类或结构数组进行排序的通用函数 的相关文章

  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB
  • 如果多个键是相同的 JS,则对对象中的值求和

    例如我有 5 个对象 row aa col 1 value 1 row bb col 2 value 1 row bb col 3 value 1 row aa col 1 value 1 row aa col 2 value 1 我想对值
  • 如何将导航栏大标题转换为多行,居中对齐

    我正在尝试设计具有多行居中大标题文本的视图控制器 就像苹果的 Ask Siri Settings gt General gt Keyboards gt About Ask Siri Dictation and Privacy 我可以使用以下
  • 从数组中获取随机字符串[重复]

    这个问题在这里已经有答案了 我试图从数组 firstArray 中获取随机字符串并将其打印在 UILabel label 中 我似乎无法弄清楚并且出现错误 感谢您的帮助 我尝试搜索但找不到任何最新的教程 方法 import UIKit cl
  • 如何在 iOS 上压缩 Realm DB?

    我想定期压缩 iOS 上的 Realm 实例以回收空间 我认为该过程是将数据库复制到临时位置 然后将其复制回来并使用新的default realm 文件 我的问题是Realm 其行为就像单例并回收对象 因此我无法真正关闭它并告诉它打开新的
  • 如何复制 ArrayIterator 以保留其当前迭代位置?

    因为这似乎是我必须做的才能达到这种效果 arr a gt first b gt second iter new ArrayIterator arr Do a bunch of iterations iter gt next new iter
  • 使用 javascript Array reduce() 方法有什么真正的好处吗?

    reduce 方法的大多数用例都可以使用 for 循环轻松重写 对 JSPerf 的测试表明 reduce 通常会慢 60 75 具体取决于每次迭代内执行的操作 除了能够以 函数式风格 编写代码之外 还有什么真正的理由使用reduce 吗
  • iOS8 CoreData“使用未实现的初始化程序”

    我尝试运行我的应用程序时收到以下错误 致命错误 对类 rcresttest CatalogItem 使用未实现的初始化程序 init entity insertIntoManagedObjectContext 我可以通过将数据模型中的实体类
  • 我如何从子视图导航到 mainviewcontroller

    我刚刚开始使用 swift 我创建了一个子视图 上面有一个按钮 我想使用该按钮将我带到我的主视图控制器 我对不同的按钮使用了相同的功能 但是在同一文件中具有一个功能允许该按钮工作 代码如下 var playAgainButton UIBut
  • Highcharts 对堆积条形图进行排序

    我没有看到任何与我在 Highcharts 中遇到的确切场景相匹配的解决方案 因此我将我的发现发布在这里 我在 Highcharts 中有一个堆积条形图 需要按值从大到小对条形图进行排序并维护它们的类别关系 通常 首选解决方案是在将数据发送
  • 使用 php 在多维数组中按键排序[重复]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中对多维数组进行排序 https stackoverflow com questions 2059255 sorting multidimensional array in php 如何在
  • 关于 ArrayList[] x 的 Java 问题

    我一直对 ArrayList 数组有这个问题 也许你能帮忙 declare in class private ArrayList
  • Swift Generics 在使用继承时不会实例化泛型

    我有课Alpha and Berry class Alpha class Berry Alpha 我有一个使用继承及其泛型的函数 func myFunc
  • UIButton 导致无法识别的选择器发送到实例

    我正在尝试使用 for 循环创建多个按钮 但在使用 sender 函数时遇到问题 我有以下代码 func setUpButtons for i in 1 3 let btn UIButton UIButton frame CGRect x
  • 从 C 数组中删除大量元素的最快方法

    我有包含数千个甚至更多元素的动态数组 为了不消耗大量内存 我可以从中删除不需要的元素 即元素已被使用 不再需要它们 所以从一开始我可以通过估计每次删除元素后所需的最大大小来分配较小的内存大小 我用这个方法但是需要很长很长的时间才能完成 有时
  • GeoFire Swift 3 - 保存和更新坐标

    我正在尝试使用 GeoFire 将坐标存储到 Firebase 数据库中 我不确定如何更新新坐标 因为它们每秒都会更改 更新 随着childByAutoId 它正在为每辆自行车生成一个新的唯一 ID 如何引用这个唯一的自行车 ID 例如 用
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • Swift 中的 import 语句是否有相关成本?

    阅读字符串宣言 我看到一个段落 https github com apple swift blob master docs StringManifesto md batteries included关于避免Foundation不需要的时候导
  • Xcode 8 / Swift 3:“UIViewController 类型的表达式?未使用”警告

    我有以下函数 它之前编译得很干净 但在 Xcode 8 中生成警告 func exitViewController navigationController popViewController animated true UIViewCon

随机推荐

  • php的sqlsrv库有类似mysql_real_escape_string的函数吗? [复制]

    这个问题在这里已经有答案了 我正在寻找类似的功能mysql real escape string为了SQLSRV图书馆 具体来说 我很难转义单引号 而不是逃避 像mysql您可以在另一个单引号前面使用一个单引号作为转义方法 我正在努力想出一
  • 循环/反映所有 EF 模型中的所有属性以设置列类型

    我的客户有一个使用decimal 13 4 规范存储SQL Server 小数的标准 结果 在一个非常大且仍在增长的模式中 我有近一百个这样的语句 builder Entity
  • 如何防止窗户被移动?

    我将如何阻止表格被移动 我将表单边框样式设置为 固定单一 并希望保持这种方式 因为它在 vista 中看起来不错 看看这个link 您可能对选项 3 感兴趣 它将要求您包装一些本机代码 但应该可以工作 链接底部还有一条评论 显示了一种更简单
  • Xamarin Forms 日期和时间选择器

    我正在使用 Xamarin Forms 制作跨平台应用程序 我需要创建用户可以选择日期和时间的简单视图 类似于 我要创建的视图我在这里找到的 Xamarin iOS 中的选择器 Android 的解决方案已准备就绪 但我需要在同一应用程序中
  • 如何测试反射得到的Java字段的值是否为null?

    I have Field f this getClass getFields 0 我需要知道是否f的值在this is null或不 有很多方法 例如getInt and getDouble 但我还没有找到类似的方法Object getDa
  • 如何在WP7 / WP8中向本地html页面传递参数?

    有谁知道如何将 url 参数传递到 Web 浏览器控件中的本地页面 当您单独导航到该页面时 Html MyPage html 一切都很好 但是一旦添加参数 Html MyPage html Message Hello 我收到一个错误页面 指
  • 使用struts2和Ajax下载文件时如何放置进度条

    我无法放置进度条 因为它直接重定向页面并下载文件 这么多问题 其中大部分是隐含的 集中在一个问题中 使用struts2和Ajax下载文件时如何放置进度条 如果不需要 不要使用AJAX下载 当您在浏览器中打开文件时 contentDispos
  • 我们可以在棒棒糖设备中显示旧式时间选择器(Pre Lollipop Time Picker)

    我想在棒棒糖设备中显示较旧的时间选择器 例如棒棒糖设备之前的时间选择器 可以 这个是可以的 您可以通过将 timePickerMode 属性设置为 spinner 来指定微调器样式的时间选择器 材质的默认值为 clock
  • 如何计算相对价值再平衡的 if 语句/错误:“系列的真值不明确”

    下面是我编写的代码 用于计算 df a 和 df b 值的相对变化 而 df 是一个数据帧 基本上需要计算的是df c df a df a iloc df d values df d 设置为等于 df t 如果df a df a iloc
  • JavaScript 什么时候是同步的?

    我一直认为 JavaScript 总是异步的 然而 我了解到有些情况并非如此 即 DOM 操作 关于何时同步 何时异步 是否有一个很好的参考 jQuery 对此有影响吗 JavaScript 始终是同步和单线程的 如果您在页面上执行 Jav
  • PHP Foreach 循环和 DOMNodeList

    我试图确定以 DOMNodeList 集合为种子的 foreach 循环的结束 目前 我正在使用 for 循环 希望避免出现 魔术 数字 我确实知道只有 8 列 但我希望代码对其他应用程序通用 是否可以将其转换为 Foreach 循环 我尝
  • 递归地进行更改:如何修改算法以打印所有组合?

    我有一个算法 可以通过以下方式递归地进行更改 public static int makeChange int amount int currentCoin if amount zero we are at the bottom of a
  • 将包含列表的 pandas 列“unstack”成多行[重复]

    这个问题在这里已经有答案了 假设我有以下 Pandas 数据框 df pd DataFrame a 1 2 3 b 1 2 2 3 4 5 a b 0 1 1 2 1 2 2 3 4 2 3 5 我如何 取消堆叠 b 列中的列表以便将其转换
  • WCF:使用 WsHttpBinding 是否可以互操作?

    顾名思义 现在我正在使用 BasicHttpBinding 但我想知道是否可以切换到 WSHttpBinding 并且仍然可以与 Java 等设备进行互操作 wsHttpBinding 和较新的 ws2007HttpBinding 都实现
  • r for 回归循环 lm(y~x)

    Example df lt data frame A 1 5 B 2 6 C 3 7 D 4 8 E 5 9 F 6 10 我想使用像 y 一样的列 1 和 2 以及像 x 一样的其余列来制作回归循环 lm y x my idea lmf
  • 将动态生成的列表中的数据从一个页面传递到另一页面

    在我的 jquery 移动应用程序中 我有一个动态生成的列表视图 我想要做的是当用户单击列表项时 我想从列表项中的隐藏字段获取一个值并将该值传递到另一个页面 以便我可以根据该变量值进行查询 这是多页布局 由于我与第一页位于同一 DOM 中
  • 如何在android中制作通话记录应用程序

    我是一名 android 新手程序员 我想制作一个 android 应用程序来记录电话活动 例如来电 去电或未接来电 并将日志记录到文件 txt 我应该怎么办 请帮我 看一眼通话记录 通话 以下是一些有关使用通话记录的好教程 android
  • 当 JSONP 和 CORS 等解决方法存在时,为什么浏览器有同源策略?

    这个问题有点重复 为什么 XMLHttpRequest 的同源策略 然而 这个答案并不令人满意 因为它没有解决存在解决方法的事实 如问题中所述 答案仅解决与 XMLHttpRequest 直接相关的安全问题 但 JSONP 仍然存在这些问题
  • jquery 一对一切换多个div

    我想做的是在不同的 div 之间切换 这有点难以解释 但我会尝试一下 当页面加载时 将有一个可见的 div 和 4 个带有 display none 的 div 会有一个菜单 链接 1 将显示第一个 div 并隐藏所有其他 div 然后 当
  • Swift 中按属性对类或结构数组进行排序的通用函数

    我想创建一个通用函数来根据传递的属性对类数组进行排序 例如 我有这些课程 public class Car var id Int var manufacturer String var variant String init id Int