Swift闭包中访问字典报错:类型'(Int)->[Int:Bool]'无下标
问题分析与解决
报错原因
你遇到的报错"Value of type '(Int) -> [Int : Bool]' has no subscripts"有两个核心原因:
- 闭包类型不匹配:你的
createDict函数是接收[Int]数组返回字典,但myFuncBig定义的someFunc参数类型是(Int) -> [Int:Bool](接收单个Int返回字典),类型完全不匹配。 - 函数与实例混淆:即便类型正确,
someFunc是生成字典的函数,不是字典实例本身。直接用someFunc[i]相当于给函数加下标,这在Swift里是不允许的——你必须先调用函数得到字典,再对字典用下标。
修正后的代码
第一步:修正主函数的闭包参数类型,并提前生成目标字典
func myFuncBig(arrayToChange: [Int], listToTakeToFind: [Int], someFunc: ([Int]) -> [Int:Bool]) -> [Int] { // 调用闭包,传入目标列表生成字典 let targetDict = someFunc(listToTakeToFind) var sortedList = [Int]() for i in arrayToChange { // 用生成好的字典判断元素是否存在 if targetDict[i] != nil { sortedList.append(i) } } return sortedList }
第二步:保留原有的字典生成函数(无需修改)
func createDict(array: [Int]) -> [Int:Bool] { var dictToReturn = [Int: Bool]() for item in array { dictToReturn[item] = true } return dictToReturn }
第三步:调用示例
let inputArray = [1,2,3,42,342,34,3,3,2,4,5,2,3] let listToFind = [1,2,3,4] let filteredResult = myFuncBig(arrayToChange: inputArray, listToTakeToFind: listToFind, someFunc: createDict) print(filteredResult) // 输出:[1, 2, 3, 3, 3, 2, 4, 2, 3]
额外优化(可选)
判断元素是否在字典里,用targetDict.keys.contains(i)语义更清晰,或者直接用if targetDict[i] == true,效果和!= nil一致,但可读性更好。
内容的提问来源于stack exchange,提问作者surfg
相关产品推荐
相关产品推荐

