将闭包放入字典中

问题描述 投票:0回答:1

在 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 dictionary uikit closures
1个回答
0
投票
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"
    ,则:

初始化:

var actionDict : [String : (()->())] = [:]

设置:
actionDict[an] = { logAction(an) }

致电:
actionDict["abc"]()


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

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


  1. 如果功能不同,效果也不同。

actionDict["print"]("xyz")
actionDict["dump"]("abc")

actionDict["typecast"]("mno")
actionDict["split"]("$#$#$")

所以这第三个就是您正在寻找的!

© www.soinside.com 2019 - 2024. All rights reserved.