Swift中根据值获取字典键的函数原理及泛型含义咨询
理解Swift字典根据值找键的泛型函数
嘿,我来一步步帮你拆解这段代码,搞懂它的工作原理和泛型部分的含义:
1. 泛型声明 allKeysForValue<K, V : Equatable> 是什么意思?
这里的K和V是泛型类型占位符,用来让这个函数能适配任意类型的字典,而不是只能处理某一种固定类型(比如[String:Int]或者[Int:String]):
K:代表字典里键的类型(Key的缩写),可以是Int、String、甚至自定义类型(只要符合字典键的要求,比如遵循Hashable,不过函数参数里的[K:V]已经隐含了K必须是Hashable,因为Swift字典的键默认要求Hashable)V : Equatable:代表字典里值的类型(Value的缩写),后面的: Equatable是约束——要求这个值类型必须遵循Equatable协议,因为我们需要用==来比较字典里的值和传入的val是否相等,只有遵循Equatable的类型才能用==做比较。
2. 函数参数与返回值
函数签名里的dict: [K : V]表示传入的参数是一个键类型为K、值类型为V的字典;val: V是我们要查找的目标值;返回值[K]是所有匹配该值的键组成的数组。
3. 函数体的工作逻辑
函数体是一行链式调用,拆开来理解更清楚:
// 第一步:过滤出所有值等于val的键值对 let filteredPairs = dict.filter{ $0.1 == val } // 第二步:把过滤后的键值对转换成键的数组 let resultKeys = filteredPairs.map{ $0.0 } return resultKeys
dict.filter{ $0.1 == val }:filter会遍历字典的每一个键值对(字典的元素是(key: K, value: V)的元组,$0代表当前遍历到的元组),$0.1就是元组里的值部分,我们只保留那些值等于val的键值对。.map{ $0.0 }:map会把过滤后的每个键值对元组转换成它的键部分($0.0是元组的第一个元素,也就是键),最终得到一个所有匹配键的数组。
举个实际例子
比如我们有这样一个字典:
let fruitCounts = ["apple": 2, "banana": 3, "orange": 2, "grape": 3]
调用这个函数找值为2的键:
let keys = allKeysForValue(dict: fruitCounts, val: 2) print(keys) // 输出 ["apple", "orange"]
这样就直观看到函数的作用啦~
内容的提问来源于stack exchange,提问作者mazen
相关产品推荐
相关产品推荐

