You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按指定顺序排序含关联值的HomeScreenDataType枚举数组?

解决方案

步骤1:给枚举添加排序优先级属性

在你的HomeScreenDataType枚举中新增一个计算属性,用来标记每个case对应的排序权重,对应你需要的固定顺序:

enum HomeScreenDataType {
    case topBanners([TopBanner])
    case bottomBanner([BottomBanner])
    case productCategory([ProductCategory])
    case favouriteStores([FavouriteStores])
    case subscriber([Subscriber])
    
    // 定义每个case的排序优先级
    var sortOrder: Int {
        switch self {
        case .topBanners: return 0
        case .bottomBanner: return 1
        case .productCategory: return 2
        case .favouriteStores: return 3
        case .subscriber: return 4
        }
    }
}

步骤2:等待所有异步请求完成后排序

因为是多异步请求并行获取数据,推荐用DispatchGroup监听所有请求的完成状态,确保所有数据都添加到数组后再执行排序操作:

let dispatchGroup = DispatchGroup()
var homeScreenData = [HomeScreenDataType]()

// 示例:发起TopBanner数据请求
dispatchGroup.enter()
fetchTopBanners { banners in
    if let banners = banners {
        homeScreenData.append(.topBanners(banners))
    }
    dispatchGroup.leave()
}

// 同理发起另外4个异步请求,每个请求前后都要调用enter()和leave()

// 所有请求完成后执行排序
dispatchGroup.notify(queue: .main) {
    // 按sortOrder属性排序数组
    homeScreenData.sort { $0.sortOrder < $1.sortOrder }
    // 此处可执行UI更新或后续业务逻辑
}

补充说明

  • 每个异步请求必须正确配对enter()和leave(),保证DispatchGroup的计数逻辑正常,否则notify回调不会触发。
  • 排序逻辑直接依赖枚举的sortOrder属性,后续如果需要调整顺序,只需修改对应case的返回值即可,维护成本低。

内容的提问来源于stack exchange,提问作者Ganesh Pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:05:19