You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift闭包中访问字典报错:类型'(Int)->[Int:Bool]'无下标

问题分析与解决

报错原因

你遇到的报错"Value of type '(Int) -> [Int : Bool]' has no subscripts"有两个核心原因:

  1. 闭包类型不匹配:你的createDict函数是接收[Int]数组返回字典,但myFuncBig定义的someFunc参数类型是(Int) -> [Int:Bool](接收单个Int返回字典),类型完全不匹配。
  2. 函数与实例混淆:即便类型正确,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:50:21