如何让Swift字典按初始插入顺序排序并在SwiftUI列表展示
按指定顺序展示SwiftUI列表中的字典项
方法1:使用OrderedDictionary(推荐)
Swift标准库的普通Dictionary虽当前会保留插入顺序,但官方未承诺该行为长期稳定。若需可靠的顺序控制,推荐使用Collections框架的OrderedDictionary,它会严格维护元素的插入顺序。
步骤:
- 导入
Collections框架(Xcode 13+默认支持,无需额外配置) - 将普通字典替换为
OrderedDictionary - 直接遍历,无需额外排序
代码示例:
import Collections VStack(spacing: 0) { let privacyDictionary: OrderedDictionary<String, String?> = [ strings.personalProfile: strings.settingsOn, strings.personalOffers: strings.settingsOf, strings.generalOffers: strings.settingsOn, strings.contactChannels: nil ] ForEach(privacyDictionary.elements, id: \.key) { key, value in ListItem(title: [key], statusText: value, icon: .listitem_chevron_right, type: .clickable) } }
方法2:自定义排序规则(无需额外依赖)
若不想引入外部框架,可通过定义优先级数组来强制指定排序顺序:
代码示例:
VStack(spacing: 0) { let privacyDictionary = [ strings.personalProfile: strings.settingsOn, strings.personalOffers: strings.settingsOf, strings.generalOffers: strings.settingsOn, strings.contactChannels: nil ] // 明确指定期望的展示顺序 let desiredOrder = [ strings.personalProfile, strings.personalOffers, strings.generalOffers, strings.contactChannels ] // 根据元素在优先级数组中的索引排序 let sortedPrivacyItems = privacyDictionary.sorted { guard let index1 = desiredOrder.firstIndex(of: $0.key), let index2 = desiredOrder.firstIndex(of: $1.key) else { return false } return index1 < index2 } ForEach(sortedPrivacyItems, id: \.key) { key, value in ListItem(title: [key], statusText: value, icon: .listitem_chevron_right, type: .clickable) } }
内容的提问来源于stack exchange,提问作者user20273483
相关产品推荐
相关产品推荐

