如何在Swift字典中存储访问函数?Any类型导致函数无法调用
在Swift字典中存储并调用函数的正确类型设置
你碰到的这个问题很典型——用Any作为字典值类型存储函数后,确实没法直接调用,因为Swift没法确定Any类型的实例是可调用的函数。我来帮你拆解下问题和正确的处理方式:
问题出在哪?
你的初始代码有两个关键问题:
- 类型太宽泛:
[String : Any]这个类型让Swift丢失了函数的类型信息,取出的值是Any,自然无法直接调用。 - 错误存储了函数返回值:你写的
CurrentDifferenceFunctions().calculateFunction1()是直接调用了函数,把函数的返回值(而不是函数本身)存进了字典,这完全不是你想要的。
看你的初始代码:
func updateCalculations(_ function: String) { let functions : [String : Any] = ["calculateFunction1": CurrentDifferenceFunctions().calculateFunction1(), "calculateFunction2": CurrentDifferenceFunctions().calculateFunction2()] let funcDict = functions[function] guard let function = funcDict else { return } func beginCalculations() { function() //Expression of type 'Any' is unused } }
正确的解法
你后来的修改完全正确!核心就是根据函数的签名指定精确的闭包类型:
- 如果你的函数是无参数、无返回值的,字典值类型就用
() -> Void - 一定要直接引用函数本身(不要加括号
()),这样存储的才是函数的引用,而不是调用后的结果
正确代码:
let functions : [String : () -> Void] = ["calculateFunction1": CurrentDifferenceFunctions().calculateFunction1, "calculateFunction2": CurrentDifferenceFunctions().calculateFunction2]
之后你从字典里取出的值就会被推断为() -> Void类型,直接调用function()就完全没问题了。
如果你的函数有参数或者返回值,只要对应调整闭包类型就行,比如:
- 带一个
Int参数、返回String的函数,类型是(Int) -> String - 带两个
Double参数、返回Double的函数,类型是(Double, Double) -> Double
内容的提问来源于stack exchange,提问作者Wizzardzz
相关产品推荐
相关产品推荐

