我有2个不同的 struct ,有很多不同的变量,但每个 struct 都有一个日期变量.我希望在快速用户界面中按日期顺序将这两个数组显示在列表中.如何将两个不同 struct 的数组组合成一个数组,然后根据日期对它们进行排序?

struct Struct1: Identifiable, DateSortable {
    let id = UUID()
    let date: Date
    let property1: String // Add other properties specific to Struct1
}

struct Struct2: Identifiable, DateSortable {
    let id = UUID()
    let date: Date
    let property2: Int // Add other properties specific to Struct2
}

struct ContentView: View {
    let structArray: [Struct2] = [
        Struct2(date: Date(), property2: 10), // Example data
        Struct2(date: Date().addingTimeInterval(86400), property2: 20), // Example data
        Struct2(date: Date().addingTimeInterval(172800), property2: 30) // Example data
    ]
    
    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 10) {
                ForEach(structArray) { item in
                    VStack(alignment: .leading) {
                        Text("ID: \(item.id)")
                        Text("Date: \(item.date)")
                        Text("Property2: \(item.property2)")
                    }
                    .padding()
                    .background(Color.gray.opacity(0.2))
                    .cornerRadius(10)
                }
            }
            .padding()
        }
    }
}

推荐答案

代码比其他答案少得多:)

struct ContentView: View {
    let myData: [MyWrapper] = [
        MyWrapper(date: Date(), data: Struct1(property1: "hello")),
        MyWrapper(date: Date().addingTimeInterval(86400), data: Struct2(property2: 10)),
        MyWrapper(date: Date().addingTimeInterval(172800), data: Struct2(property2: 30))
    ]
    // !!!ORDER!!!
    .sorted( by: { $0.date < $1.date } )
    
    var body: some View {
        ScrollView {
            VStack(alignment: .leading, spacing: 10) {
                ForEach(myData) { item in
                    VStack(alignment: .leading) {
                        Text("ID: \(item.id)")
                        Text("Date: \(item.date)")
                        
                        if let tmp = item.data as? Struct1 {
                            Text("Property1: \(tmp.property1)")
                        }
                        
                        if let tmp = item.data as? Struct2 {
                            Text("Property2: \(tmp.property2)")
                        }
                    }
                    .padding()
                    .background(Color.gray.opacity(0.2))
                    .cornerRadius(10)
                }
            }
            .padding()
        }
    }
}

struct MyWrapper: Identifiable  {
    var id = UUID()
    var date: Date
    var data: any MyData
}

protocol MyData { }

struct Struct1: MyData {
    let property1: String
}

struct Struct2: MyData {
    let property2: Int
}

enter image description here

Swift相关问答推荐

如何避免使用DispatchSemaphores时线程爆炸?

为什么我的引用类型对象在初始化后有3个强引用?

绑定到可选值的非可选属性?'

RealityKit(VisionOS)中的PhysicBodyComponent和DragGesture

Swift:iVar + Equatable上的协议约束

在Swift中,是否只有iOS版本超过15才能导入Swift包?

在SWIFT中使用Objective-C struct 时出错(在作用域中找不到类型)

如何增加 NSStatusBar 图像大小?

Swift计时器未触发

macOS 的窗口框架中使用的真实类型和真实类型是什么?

SwiftUI 从任务中安全更新状态变量

如果 Swift 无法分配内存会怎样?

SwiftUI 视图的默认成员初始化器 VS 自定义初始化器

SwiftUI 文本被意外截断

更新我的 pod 导致 GoogleDataTransport Umbrella 标头出现错误

Swift 5.0 编译器无法导入使用 Swift 4.2.1 编译的模块

更改日期 Select 器的文本 colored颜色

如何在 GCD 中停止 DispatchWorkItem?

强制打开已在同一行代码中 Select 性访问的变量是否安全?

为什么枚举具有计算(computed)属性但在 Swift 中没有存储属性?