是否有可能在相同的ForEach中有2 structs/arrays个(对于备选方案3)?如果是这样的话,是如何做到的呢?我所有的try 都没有成功.

import Foundation
import SwiftUI

struct Car: Vehicle, Identifiable {
    let id = UUID()
    let name: String
}

struct Bike: Vehicle, Identifiable {
    let id = UUID()
    let name: String
}

let cars = [Car(name: "Renault"), Car(name: "Peugeot")]

let bikes = [Bike(name: "Yamaha"), Bike(name: "Honda")]

protocol Vehicle {
    var name: String { get }
}

struct ParentView: View {
    var body: some View {
        // Option 1 OK
        ForEach(cars.sorted { $0.name < $1.name }) { car in
            ChildView(vehicle: car)
        }

        // Option 2 OK
        ForEach(bikes.sorted { $0.name < $1.name }) { bike in
            ChildView(vehicle: bike)
        }

        // Option 3 NOT OK
        ForEach((cars, bikes).sorted { $0.name < $1.name }) { vehicle in
            ChildView(vehicle: vehicle)
        }
    }
}

struct ChildView: View {
    let vehicle: Vehicle

    var body: some View {
        Text(vehicle.name)
    }
}

谢谢,提前谢谢!

推荐答案

当您不想或根本不能仅仅为了遵守某些UI要求而更改协议时,这里有一个替代解决方案.

我们希望使用符合Vehicle的任何类型,但又能够通过也符合Identifiable来有效地使用List/ForEach.对于此解决方案,我们可以为此创建包装器类型

struct VehicleUI: Identifiable {
    let id = UUID()
    let vehicle: any Vehicle
}

然后,我们可以直接在视图或某个模型类中映射和连接类型

(cars + bikes)
    .map(VehicleUI.init)
    .sorted(using: KeyPathComparator(\.vehicle.name, order: .forward))

示例:

struct ParentView: View {
    var vehicles: [VehicleUI]  {
        (cars + bikes)
            .map(VehicleUI.init)
            .sorted(using: KeyPathComparator(\.vehicle.name, order: .forward))
    }
    var body: some View {
        List {
            ForEach(vehicles) { vehicle in
                ChildView(vehicle: vehicle.vehicle)
            }
        }
    }
}

Swift相关问答推荐

为表单部分赋予背景 colored颜色 /渐变

map 视图上的SwiftUI渐变折线

通常从数组调用的SWIFT静态协议函数

SwiftUI:为什么@State在子视图中持续存在?

修改数组中每个类实例的属性

出错-无法将季节类型的值转换为预期的参数类型';[水果]';

为什么枚举上的.allCases.forEach不是循环(继续和中断不起作用)?

Swift计时器未触发

使用索引来访问 libc 定义的元组

如何使用 Swift 在非本地函数中切换()一个 Bool?

列表不显示信息

Swift-SceneKit-无法从art.scnassets加载.scn文件

单击按钮后的计时器发布者初始化计时器

Vapor, fluent 使用 PostgreSQL 保存/创建复杂模型

SwiftUI 文本被意外截断

Swift 函数 vs 惰性变量 vs 计算(computed)属性 - 区别?

无法分配给属性:self 是不可变的,我知道如何修复但需要理解

如何实现 Swift 的 Comparable 协议?

Swift 覆盖实例变量

在 xcode8 中找不到 ModuleName-Swift.h 文件