在 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]
}
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"
,则:初始化:
var actionDict : [String : (()->())] = [:]
设置:
actionDict[an] = { logAction(an) }
致电:
actionDict["abc"]()
"xyz"
,则:每个值都具有相同类型闭包(带有 String 参数)的字典是没有意义的。
,actionDict["print"]("xyz")
actionDict["dump"]("abc")
,actionDict["typecast"]("mno")
actionDict["split"]("$#$#$")
所以这第三个就是您正在寻找的!