首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

按id对自定义对象的SwiftUI数组进行排序

在SwiftUI中,如果你有一个自定义对象的数组,并且你想根据某个属性(例如id)对这些对象进行排序,你可以使用Swift的sorted(by:)方法。下面是一个基础的例子,展示了如何定义一个自定义对象,以及如何根据id属性对这个对象的数组进行排序。

自定义对象定义

首先,定义一个自定义对象,假设我们有一个Person类,它有一个id属性和一个name属性:

代码语言:txt
复制
struct Person: Identifiable {
    let id: Int
    let name: String
}

创建数组并进行排序

接下来,创建一个Person对象的数组,并使用sorted(by:)方法根据id进行排序:

代码语言:txt
复制
let people = [
    Person(id: 3, name: "Charlie"),
    Person(id: 1, name: "Alice"),
    Person(id: 2, name: "Bob")
]

let sortedPeople = people.sorted { $0.id < $1.id }

在SwiftUI中使用排序后的数组

在SwiftUI中,你可以直接在ListForEach中使用这个排序后的数组:

代码语言:txt
复制
import SwiftUI

struct ContentView: View {
    let sortedPeople: [Person]

    var body: some View {
        List(sortedPeople) { person in
            VStack(alignment: .leading) {
                Text(person.name)
                    .font(.headline)
                Text("ID: \(person.id)")
                    .font(.subheadline)
                    .foregroundColor(.gray)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(sortedPeople: [
            Person(id: 3, name: "Charlie"),
            Person(id: 1, name: "Alice"),
            Person(id: 2, name: "Bob")
        ].sorted { $0.id < $1.id })
    }
}

解释

  • 自定义对象Person结构体实现了Identifiable协议,这使得它可以在SwiftUI中更容易地用于列表和其他需要唯一标识符的组件。
  • 排序sorted(by:)方法接受一个闭包,该闭包定义了排序的规则。在这个例子中,我们比较两个Person对象的id属性来确定它们的顺序。
  • SwiftUI视图:在ContentView中,我们使用List来展示排序后的Person对象数组。每个Person对象都会显示其nameid

这种方法简单且高效,适用于大多数基于SwiftUI的应用程序中对自定义对象数组进行排序的场景。如果你遇到任何问题,比如排序不正确或者性能问题,你应该检查你的比较逻辑是否正确,以及数组的大小是否合理。如果数组非常大,可能需要考虑更高效的排序算法或者分页加载数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

将包含时间戳的对象数组按天排序

问题描述 示例对象数组如下,每个对象中都有一个时间戳,现在要求将每个对象按照其中的时间戳对应的天数进行排列,如何实现?...1544681075426, curURL: 'http://www.baidu.com', title: '百度首页哈哈哈哈哈哈哈哈哈哈哈' }, ]; 1、数组排序...首先,需要先将上面的对象数组按照时间戳有小到大排好序。...排序函数: let list = list.sort(function(a, b) { return a.time - b.time; }); 排好序的对象数组如下: var list = [...,所以比较新时间戳的时候,只需要与排好的日期的最后一个日期进行对比,如果在最后一个日期以内就加到这个时间戳对应的日期数组中去去,如果不在就往后面日期排,以此类推。

3.8K20
  • 使用 Python 对波形中的数组进行排序

    在本文中,我们将学习一个 python 程序来对波形中的数组进行排序。 假设我们采用了一个未排序的输入数组。我们现在将对波形中的输入数组进行排序。...− 创建一个函数,通过接受输入数组和数组长度作为参数来对波形中的数组进行排序。 使用 sort() 函数(按升序/降序对列表进行排序)按升序对输入数组进行排序。...使用 for 循环遍历直到数组长度(步骤=2) 使用“,”运算符交换相邻元素,即当前元素及其下一个元素。 创建一个变量来存储输入数组。 使用 len() 函数(返回对象中的项数)获取输入数组的长度。...例 以下程序使用 python 内置 sort() 函数对波形中的输入数组进行排序 − # creating a function to sort the array in waveform by accepting...结论 在本文中,我们学习了如何使用两种不同的方法对给定的波形阵列进行排序。与第一种方法相比,O(log N)时间复杂度降低的新逻辑是我们用来降低时间复杂度的逻辑。

    6.9K50

    委托示例(利用委托对不同类型的对象数组排序)

    System.Collections.Generic; using System.Text; namespace delegateTest {     ///      /// 演示利用委托给不同类型的对象排序...数组,按工资高低排序             for (int i = 0; i < employees.Length; i++)             {                 ..., 6, 0 };             c1 = new CompareOp(CompareInt);             BubbleSorter.Sort(ints, c1);//对ints...数组,按数值大小排序             for (int i = 0; i < ints.Length; i++)             {                 Console.WriteLine...,比较大小的方法不同,比如Employee是按工资高低来比较,int是按数字大小来比较,利用委托的好处就在于不用管具体用哪种方法,具体调用的时候才确定用哪种方法

    1.7K90

    C语言实例:实现对英文的12个月份按字母进行排序

    需求 C语言实现对英文的12个月份按字母进行排序 源码 // // @author: 冲哥 // @date: 2021/6/3 20:38 // @description:C语言实现对英文的12个月份按字母进行排序...March","April","May","June","July","August","September","October","November","December"}; printf("排序前...{ printf("%s ", month[i]); } printf("\n"); p = month; sort(p); printf("排序后...作比较时使用到了strcmp()函数 这里简单说下这个函数 「函数原型」:int strcmp(const char* stri1,const char* str2); 用于对两个字符串进行比较(区分大小写...) 「函数作用」:根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(遇见\0) 「函数返回值」: 如果返回值 < 0,则表示 str1 小于

    2.8K20

    SwiftUI 与 Core Data —— 数据获取

    在创建自定义 DynamicProperty 类型时,需要注意以下几点:可以在自定义类型中使用环境值或环境对象在视图被加载后,视图中所有符合 DynamicProperty 协议的类型也将一并具备访问环境数据的能力...当 SwiftUI 在视图存续期中重新创建视图描述实例时,自定义类型也将一并重新创建在视图存续期中,如果 SwiftUI 创新创建了视图描述实例,那么无论视图描述( 符合 View 协议的 Struct..."Todo Groups") }}避免对不引发 ID 变化的操作更新数据集当数据集的 ID 顺序或数量没有发生变化时,即使数据的属性值发生变化,MockableFetchRequest 也不会更新数据集...( sectionIdentifier 为首要排序条件 ),并同时提供每个 Section 在返回数组中对应的起始 offset( 或对应的 ID )以及该 Section 中的数据量。...将所有的数据以一个数组进行返回( sectionIdentifier 为首要排序条件 ),在每个 Section 头尾插入特定的 AnyConvertibleValueObservableObject

    4.7K30

    如何结合 Core Data 和 SwiftUI

    使用获取请求从 Core Data 中检索信息——我们描述了我们想要的内容,应如何对其进行排序以及是否应使用任何过滤器,然后 Core Data 会发回所有匹配的数据。...: []) var students: FetchedResults 分解之后,这创建了一个获取的“学生”实体的请求,不进行任何排序,而是将其放入名称为students,类型为FetchedResults...更好的是,它已经将其添加到 SwiftUI 环境中,这就是@FetchRequest属性包装器起作用的原因——它使用了环境中可用的任何托管对象上下文。...// more code to come } **注意:**不可避免地有人会抱怨我强行对randomElement()调用,但是实际上我们只是手工创建了具有值的数组——它将永远成功。...self.moc.save() 最后,您现在应该可以运行该应用程序并对其进行尝试——单击几次 “Add” 按钮以生成一些随机的学生,您应该看到他们滑入我们列表的某个位置。

    11.8K30

    Ask Apple 2022 与 SwiftUI 有关的问答(下)

    SwiftUI 4.0 的 Form 在 Ventura 上的表现与以往版本有很大的不同。形式上更接近 iOS 的状态,同时也对 mac 进行了更多的适配。...快速检索数组元素Q:为什么没有简单的方法将 TABLE 选择的行映射到提供表内容的数组元素上?似乎唯一的方法是在数组中搜索匹配的 id 值,这对于大表来说似乎效率很低。...,同时在更新 IdentifiedArray 时,也不容易引发 ForEach 的异常todos[id:id] = newTodo自定义布局Q:在实现自定义布局时,处理非常小或非常大的可用空间的边缘情况有多重要...任何自定义布局的完整实现都比我在这里的帖子中快速勾勒出来的要长,但总体思路是,你可以创建一个布局来查询其子级的理想大小并相应地对它们进行排序。...Q&A ( 集锦 - 简体中文 )下文中的问题来自开发者与苹果工程师在【 集锦 - 简体中文 】频道进行的中文讨论( 没有出现在英文 SwiftUI 频道中 )。我直接对其进行了复制粘贴。

    14.8K30

    使用 SwiftUI 创建一个灵活的选择器

    此外,为了能够通过映射字符串值数组创建 Selectable 对象,实现 Selectable 的对象必须提供带 displayedName 作为参数的自定义初始化。...此外,符合 Selectable 协议的所有对象都将实现存储 UUID 值的常量 id。 我会故意省略符合 Selectable 协议的对象的实现,因为我认为这是显而易见的。...我的目标不仅是创建灵活的选择器的实现,还要尽量使其可自定义。...,我们可以遍历所有输入数据并将它们分成单独的数组。...我们有两个数组: singleLineResult 数组——负责存储适合特定行的项目 allLinesResult 数组——负责存储所有项目数组(每个数组都等同于一行项目) 首先,我们检查从 HStack

    30120

    在iOS 16中用SwiftUI Charts创建一个折线图

    此外,自定义图表的外观和感觉以及使图表中的信息易于访问也是非常容易的。 如以前的文章所示,不使用SwiftUI Charts也可以创建一个折线图。...在SwiftUI中创建折线图 How to create a Bar Chart in SwiftUI 简单折线图 从包含一周的步数的数据开始,类似于在SwiftUI中创建折线图中使用的数据。...定义一个结构来保存日期和该日的步数,并为当前周创建一个数组。..."Current Week", data: currentWeek), (period: "Previous Week", data: previousWeek) ] 第一次尝试添加这两个系列的数据没有按预期显示...另外,前景的样式设置为基于stepCount数组的周期。折线图使用 x 轴的工作日来显示两周的步数,以便在周之间进行比较。

    3.5K20

    优化在 SwiftUI List 中显示大数据集的响应效率

    创建数据集 通过 List 展示数据集 用 ScrollViewReader 对 List 进行包裹 给 List 中的 item 添加 id 标识,用于定位 通过 scrollTo 滚动到指定的位置...列表视图的初始化和 body 求值 如果对 SwiftUI 的 NavigationView 有一定了解的话,应该知道 SwiftUI 会对 NavigationLink 的目标视图进行预实例化(但不会对...在 SwiftUI 视图的生命周期研究[3] 一文中,我对 List 如何对子视图的显示进行优化做了一定的介绍。...id 修饰符标识是通过 IDViewList 对显式标识视图进行跟踪、管理和缓存,它与 ForEach 的标识处理机制完全不同。...除非没有其他选择,否则我并不推荐大家对 UIKit ( AppKit ) 控件进行重新包装,应使用尽可能微小的侵入方式对 SwiftUI 的原生控件进行补充和完善。

    9.3K20

    探讨 SwiftUI 中的几个关键属性包装器

    在这篇文章中,我们将探讨几个在 SwiftUI 开发中经常使用且至关重要的属性包装器。本文旨在提供对这些属性包装器的主要功能和使用注意事项的概述,而非详尽的使用指南。...@StateObject 专门用于管理符合 ObservableObject 协议的实例。 标注的对象实例在视图的整个生命周期中保持唯一,即使视图更新,对象实例也不会重新创建。...引入 @StateObject 意味着所有相关操作都在主线程上进行( SwiftUI 会隐式为视图添加 @MainActor),包括异步操作。应将需要在非主线程上运行的代码应该从视图代码中剥离。...UUID // 当 MyView 中的 'items' 数组改变时,这里显示的 UUID 会更新,展示了 @ObservedObject 的动态切换能力...开发者可以通过自定义 EnvironmentKey 的方式来创建自定义环境值,与系统提供的环境值一样,可以定义各种类型( 值类型、Binding、引用类型、方法的 ),详情请参阅 Custom SwiftUI

    37710

    在 iOS 16 中用 SwiftUI Charts 创建一个折线图

    前言 苹果在 WWWDC 2022 上推出了 SwiftUI 图表,这使得在 SwiftUI 视图中创建图表变得异常简单。图表是以丰富的格式呈现可视化数据的一种很好的方式,而且易于理解。...本文展示了如何用比以前从头开始创建同样的折线图少得多的代码轻松创建折线图。此外,自定义图表的外观和感觉以及使图表中的信息易于访问也是非常容易的。...定义一个结构来保存日期和该日的步数,并为当前周创建一个数组。...Current Week", data: currentWeek), (period: "Previous Week", data: previousWeek) ] 第一次尝试添加这两个系列的数据没有按预期显示...另外,前景的样式设置为基于stepCount数组的周期。折线图使用 x 轴的工作日来显示两周的步数,以便在周之间进行比较。

    3.7K20

    SwiftUI 的动画机制

    同所有 SwiftUI 的视图修饰符一样,在代码中所处的位置决定了修饰符的作用对象和范围。 animation 的作用对象仅限于它所在视图层次及该层次的子节点。 上面两段代码没有对错之分。...自定义转场 在 SwiftUI 中实现自定义转场并不困难,除非需要创建炫酷的视觉效果,大多数情况下都可以通过使用 SwiftUI 已提供的可动画部件组合而成。...struct MyTransition: ViewModifier { // 自定义转场的包装对象要求符合 ViewModifier 协议 let rotation: Angle func...这意味着,当数组中出现了两个同样的元素(点击添加按钮),SwiftUI 将无法正确识别我们的意图 —— 究竟是想对那个元素(值相同意味着标识也相同)进行操作。...控件的动画问题 SwiftUI 中的不少控件是采用对 UIKit( AppKit )控件进行封装实现的,当前的动画处理并不到位。

    14.8K40

    避免 SwiftUI 视图的重复计算

    如果视图响应了不该响应的状态,或者视图的状态中包含了不该包含的成员,都可能造成 SwiftUI 对该视图进行不必要的更新( 重复计算 ),当类似情况集中出现,将直接影响应用的交互响应,并产生卡顿的状况。...并不会在 SwiftUI 托管数据池中保存引用对象的实例( @StateObject 会将实例保存在托管数据池中 ),仅会在属性图中创建视图与视图类型实例中的引用对象的 objectWillChange...创建新实例 将新实例与 SwiftUI 当前使用的实例进行比对 如实例发生变化,用新实例替换当前实例,对实例的 body 求值,并用新的视图值替换老的视图值 视图的存续期不会因为实体的更替有所改变 由于...比对结果仅能证明两个实例之间是否不同,但 SwiftUI 无法确定这种不同是否会导致 body 的值发生变化,因此,它会无脑地对 body 进行求值。...让视图符合 Equatable 协议 为视图自定义判断相等的比对规则 在早期的 SwiftUI 版本中,我们需要使用 EquatableView 包装符合 Equatable 协议的视图以启用自定义比较规则

    9.3K81

    Ask Apple 2022 与 SwiftUI 有关的问答(上)

    contextMenu_2022-10-26_14.01.21.2022-10-26 14_02_29如何对 @State 变量进行测试Q:对于测试 SwiftUI 视图中的 @State 变量是否有推荐的方式...在单元测试中,很难对 SwiftUI 视图中的依赖( 符合 DynamicProperty 协议 )进行测试。这也是 Redux-like 框架的优势之一( 将状态从视图中抽离出来,方便测试 )。...A:没有办法对 NavigationPath 进行内省。...目前我的做法是在一个单例中保存对子上下文和托管对象的引用,然后用一个 URL 打开一个新窗口,这个 URL 在单例中检查上下文和托管对象。如果我们能用自定义参数启动新窗口,那就更好了。...属性包装器( property wrapper )类型在编译的时候,首先会对用户自定义的属性包装类型代码进行转译。

    12.3K20

    AttributedString——不仅仅让文字更漂亮

    [1] SwiftUI集成 SwiftUI的Text组件提供了对AttributedString的原生支持,改善了一个SwiftUI的长期痛点(不过TextField、TextEdit仍不支持)。...支持的文件格式 AttributedString目前仅具备对Markdown格式文本进行解析的能力。...Range 在本文之前的代码中,已经多次使用过Range来对属性字符串的内容进行访问或修改。...对属性字符串中局部内容的属性进行修改可以使用两种方式: •通过Range•通过AttributedContainer 通过关键字获取Range // 从属性字符串的结尾向前查找,返回第一个满足关键字的range...为了方便自定义属性集被用于需要指定Scope的场合,在自定义Scope中推荐嵌套入需要的系统框架Scope(swiftUI、uiKit、appKit)。

    3.9K40
    领券