Swift 5中使用typeAlias将双字典存入数组的方法及语法疑问
嘿,我来帮你把这两个问题理清楚~
一、为什么你的typealias语法不对?
先掰明白一个核心点:Swift里的typealias是给「单个具体类型」起别名,它右边必须是一个合法的、完整的单一类型,不能是多个类型凑在一起的列表。
你写的typealias dataPersDict = [[String: Int],[String: Int]],相当于把“两个独立的字典类型用逗号隔开”当成一个类型,但Swift根本不认这种写法——逗号在这里没有任何类型定义的意义,它不知道你这个“组合”到底要表示什么类型。
如果你的需求是「装了两个[String:Int]字典的数组」,那正确的类型是[[String: Int]](元素为[String:Int]的数组),对应的typealias应该是:
typealias TwoDictsArray = [[String: Int]]
但从你的代码示例来看,你实际想要的是「以字典为键、字典为值的键值对类型」(也就是[[String: Int]: [String: Int]]),这才是你代码里emplArr的真实类型,所以正确的typealias应该是:
typealias DictPairDict = [[String: Int]: [String: Int]]
二、正确用typealias将“双字典”存入数组的方式
这里的“双字典”分两种常见场景,对应不同的实现方式,你可以根据自己的需求选:
场景1:每个元素是「字典键+字典值」的键值对
这就是你代码里尝试的场景,正确写法如下:
// 给「键为[String:Int]、值为[String:Int]的字典」起别名 typealias DictPairDict = [[String: Int]: [String: Int]] // 声明存储该类型的数组 var dataArray = [DictPairDict]() // 正确添加元素 dataArray.append([["emp_id": 1000]: ["mgr_id": 100]]) dataArray.append([["emp_id": 1001]: ["mgr_id": 100]])
你之前代码里的dataPersDict写法错误,但emplArr的类型刚好和DictPairDict一致,所以append(emplArr)能跑起来纯属巧合。而最后一行append([["emp_id": 1001], ["mgr_id": 100]])报错,是因为这个元素是[[String: Int]]类型(两个字典组成的数组),和DictPairDict类型完全不匹配,自然塞不进数组里。
场景2:每个元素是「两个独立字典的组合」(不需要键值关系)
如果你的“双字典”只是想把两个字典绑定在一起,不需要强键值语义,更推荐用元组来定义,typealias能让元组的可读性更高:
// 给「包含两个[String:Int]字典的元组」起别名 typealias TwoDictTuple = (employee: [String: Int], manager: [String: Int]) // 声明存储该元组的数组 var dataArray = [TwoDictTuple]() // 添加元素,两种写法都可以 dataArray.append((["emp_id": 1000], ["mgr_id": 100])) // 用命名参数更清晰,可读性拉满 dataArray.append(employee: ["emp_id": 1001], manager: ["mgr_id": 100])
这种方式比用字典当键更稳妥:虽然Swift中[String:Int]是可哈希的(能当字典键),但如果后续字典内容变了,哈希值也会跟着变,可能导致在集合或字典里找不到它;而元组的语义更明确,直接表示“一对字典”,完全没这个问题。
小提醒:字典当键的注意事项
如果你一定要用场景1的方式,记得作为键的字典内容最好是固定的——因为字典的哈希值是基于它的内容计算的,内容一变,哈希值就变,后续再想从数组里对应的字典键值对中查找,很可能会失败哦。
内容的提问来源于stack exchange,提问作者iPadawan

