将闭包放入字典

Putting a closure into a dictionary

提问人:psb 提问时间:9/2/2023 最后编辑:HangarRashpsb 更新时间:9/12/2023 访问量:56

问:

在iOS应用程序中,我有一个弹出按钮,其中包含可以更改的项目名称列表。 我正在尝试制作一个字典来存储根据所选项目执行的不同操作。[String : (String)->Void]

下面的函数给了我以下错误:

无法将类型为“()”的值分配给类型为“(String) -> Void”的下标

我的闭包不是类型,还是我声明不正确?(String)->Void

func selectOption(action : UIAction) {
    var actionDict : [String : (String)->Void] = [:]
    var assetNames : [String] = []
    assetNames = assets.map { asset in
        return asset.components(separatedBy: "@@@")[0]
    }
    var logAction = { (assetName: String) in
        print(assetName)
    }
    

    assetNames.forEach { an in
        actionDict[an] = logAction(an)
    }
}

我的理解有很大的差距。 如果我将 actionDict 的声明更改为 然后代码会编译,但它只是在我运行它时执行闭包并命中该行,它只是运行闭包而不是将其分配给字典:()actionDict[an] = logAction(an)

func selectOption(action : UIAction) {
    var actionDict : [String : ()] = [:]
    var assetNames : [String] = []
    assetNames = assets.map { asset in
        return asset.components(separatedBy: "@@@")[0]
    }
    var logAction : (String)->() = { (assetName: String)->() in
        print(assetName)
    }
    assetNames.forEach { an in
        actionDict[an] = logAction(an)
    }
    
    actionDict[action.title]
}
iOS Swift 词典 UIKit 闭包

评论

1赞 Michael Hulet 9/2/2023
您正在调用函数而不是分配其引用,因此如果编译该函数将是一个空元组 (),则实际插入的内容是返回的VoidlogAction
0赞 psb 9/2/2023
谢谢。我以为我明白你在告诉我什么,但我怀疑我不明白。(我已经更改了代码并编辑了我的问题,如上所述。
0赞 DonMag 9/2/2023
快速搜索提出了几种方法......swift store closure as a dictionary object
0赞 psb 9/2/2023
是的,我去过其中的几个。不幸的是,我无法理解它们,因此我可以将它们应用到我正在尝试做的事情中。我会坚持下去的。谢谢。
0赞 DonMag 9/2/2023
@psb - 好的...你的目标有点令人困惑......什么?你希望得到什么 和 ?assets.mapasset.components(separatedBy: "@@@")[0]

答:

0赞 b m gevariya 9/12/2023 #1
var assets: [String] = ["abc@@@XYZ", "mno@@@PQR@@@123", "xyz", "$#$#$"]

func selectOption(action : UIAction) {
    var actionDict : [String : ((String)->())] = [:]
    var assetNames : [String] = assets.map { $0.components(separatedBy: "@@@")[0] }

    var logAction : ((String)->()) = { assetName in
        print(assetName)
    }
    
    assetNames.forEach { an in
        // only logAction(an) will triggle/call stored closure 
               
        // Instead of that, you can create new closure with parameter
        actionDict[an] = { str in logAction(str) }
    }
}

现在取决于何时调用.
你期待什么?
actionDict["abc"]("xyz")


  1. 如果它应该打印,则:"abc"

初始化: setup: call:



var actionDict : [String : (()->())] = [:]actionDict[an] = { logAction(an) }
actionDict["abc"]()


  1. 如果它应该打印,则:"xyz"

每个值中具有相同类型闭包(带有 String 参数)的字典是没有意义的。


  1. 如果它因不同的功能而异,它就会起作用。

actionDict["print"]("xyz"), ,
actionDict["dump"]("abc")actionDict["typecast"]("mno")actionDict["split"]("$#$#$")

所以这第三个就是你要找的!

评论

0赞 b m gevariya 9/12/2023
需要一些问题中的输入和输出示例,以便理解所请求的任务类型。