Swift 4中如何将JSON解析后的数组按分类筛选为子数组?
解决MarketStruct数组分组的编译错误问题
咱们一步步拆解你遇到的问题,给你针对性的解决方案:
先理清第一个错误的根源
你之前处理[String:String]字典数组时,用item["category"]取分类是因为字典支持下标访问,但MarketStruct是自定义结构体,必须通过属性名访问成员,不能用下标语法,这就是Type 'MarketStruct' has no subscript members错误的原因。
比如你的结构体大概是这样的:
struct MarketStruct: Codable { let category: String // 或者是可选类型 String? let name: String // 其他JSON解析出来的属性 }
那取分类应该写item.category,而不是item["category"]。
解决Segmentation fault:11编译崩溃
这个错误是Swift编译器遇到无法处理的代码逻辑时的崩溃,大概率是可选值处理不明确或者类型推断模糊导致的,结合你注释掉分类名称代码就正常的情况,我猜你的category属性是可选类型(String?),直接用来分组时编译器无法确定字典的键类型,从而崩溃。
正确的分组实现方案
推荐用Swift标准库的Dictionary(grouping:by:)方法来分组,简洁且不容易出错,分两种情况处理:
情况1:category是确定的非可选类型(String)
直接用属性作为分组键即可:
// 假设marketArray是你从JSON解析得到的[MarketStruct]数组 let groupedMarkets: [String: [MarketStruct]] = Dictionary(grouping: marketArray) { item in item.category }
显式指定groupedMarkets的类型,能帮编译器明确推断逻辑,避免崩溃。
情况2:category是可选类型(String?)
必须处理可选值,要么给默认值,要么过滤掉无分类的项:
// 方案A:给无分类的项分配默认分类 let groupedWithDefault = Dictionary(grouping: marketArray) { item in item.category ?? "未分类" } // 方案B:只保留有分类的项再分组 let validMarkets = marketArray.filter { $0.category != nil } let groupedValid = Dictionary(grouping: validMarkets) { $0.category! }
这样处理后,分组键是明确的非可选String类型,编译器就能正常处理了。
手动分组的正确写法(如果你不想用系统方法)
如果你习惯自己写循环分组,也要注意处理可选值:
var groups = [String: [MarketStruct]]() for item in marketArray { // 处理可选值,避免键类型模糊 let categoryKey = item.category ?? "未分类" if var group = groups[categoryKey] { group.append(item) groups[categoryKey] = group } else { groups[categoryKey] = [item] } }
最后检查点
- 确认
MarketStruct的category属性和JSON里的字段类型匹配,比如JSON里是字符串,结构体就不要写成其他类型; - 如果JSON里的category可能为null,一定要把结构体属性定义为
String?,并在分组时处理可选值。
内容的提问来源于stack exchange,提问作者user8200389
相关产品推荐
相关产品推荐

