提问人:psb 提问时间:9/2/2023 最后编辑:HangarRashpsb 更新时间:9/12/2023 访问量:56
将闭包放入字典
Putting a closure into a dictionary
问:
在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]
}
答:
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")
- 如果它应该打印,则:
"abc"
初始化: setup: call:
var actionDict : [String : (()->())] = [:]
actionDict[an] = { logAction(an) }
actionDict["abc"]()
- 如果它应该打印,则:
"xyz"
每个值中具有相同类型闭包(带有 String 参数)的字典是没有意义的。
- 如果它因不同的功能而异,它就会起作用。
actionDict["print"]("xyz")
, ,actionDict["dump"]("abc")
actionDict["typecast"]("mno")
actionDict["split"]("$#$#$")
所以这第三个就是你要找的!
评论
0赞
b m gevariya
9/12/2023
需要一些问题中的输入和输出示例,以便理解所请求的任务类型。
上一个:映射到 div 网格
评论
Void
logAction
swift store closure as a dictionary object
assets
.map
asset.components(separatedBy: "@@@")[0]