Swift嵌套循环中如何正确处理可选子数组(膳食规划日历视图场景)
Swift嵌套循环中如何正确处理可选子数组(膳食规划日历视图场景)
嗨,作为Swift新手遇到这种可选数组的问题太正常啦,我来帮你捋清楚怎么搞定它~
首先先揪出一个小bug:你定义Recipetitle结构体的时候,id的写法错了,应该是var id: Int而不是var id = Int,这个小问题会导致JSON解码失败,先改过来:
struct Recipetitle: Identifiable, Codable, Hashable { var id: Int var rtitle: String }
回到核心问题:你的recipetitle是可选数组[Recipetitle]?,直接放到ForEach里会报错,因为ForEach只接受非可选的序列类型。这里有两种简单好用的解决办法:
方法1:可选绑定(推荐,支持空状态提示)
用if let把可选数组解包,只有当数组存在且非空的时候才渲染循环内容,还能顺便在空状态下显示提示文本,体验更友好:
VStack(alignment: .leading) { // 用if let解包可选的recipetitle数组 if let meals = listItems.recipetitle, !meals.isEmpty { ForEach(meals, id: \.id) { meal in HStack { Text(meal.rtitle) .font(.system(size: 11)) Spacer() Button { // 这里加删除逻辑 } label: { Text("Delete") .font(.system(size: 10)) .foregroundColor(Color.red) } .buttonStyle(.bordered) .controlSize(.regular) } .padding(.bottom, 3) } } else { // 没有膳食计划时显示提示 Text("今日暂无膳食计划") .font(.system(size: 11)) .foregroundColor(.gray) } }
方法2:nil合并运算符(极简写法)
如果空状态下你不想显示任何内容,直接用??给可选数组一个默认的空数组,这样即使recipetitle是nil,也会被转换成空数组,ForEach就能正常处理(空数组时不会渲染任何内容):
VStack(alignment: .leading) { // 用nil合并运算符给默认空数组 ForEach(listItems.recipetitle ?? [], id: \.id) { meal in HStack { Text(meal.rtitle) .font(.system(size: 11)) Spacer() Button { // 这里加删除逻辑 } label: { Text("Delete") .font(.system(size: 10)) .foregroundColor(Color.red) } .buttonStyle(.bordered) .controlSize(.regular) } .padding(.bottom, 3) } }
两种方法选哪个看你的需求:如果想给用户明确的空状态提示,就用方法1;如果空状态下直接留白就行,方法2更简洁。
备注:内容来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

