在Swift 3中将现有函数作为参数传递给另一个函数

5

我刚接触Swift,正在尝试找到一种方法将函数作为参数传递给另一个函数。我的代码结构如下:

func createDictionaryFromParams(param1: [String:String], param2: String, param3: String) -> [String:String] {
   param1["name"] = "John"
   param1["university"] = param2
   return [:]
}
func toPassAsParam() -> [String:String] {
   //doStuff
   return [:]
}

public struct passFunction {
   let dict = createDictionaryFromParams(param1: toPassAsParam(), param2: "Texas", param3: "Florida")
}

当我在playground/我的应用程序中执行上述代码时,我会收到错误信息:"无法通过下标分配:param1是一个let常量"。不确定我错在哪里,请指导我。请参考playground中精确代码的截图。enter image description here

这看起来很可疑。你到底想要实现什么? - Alexander
2个回答

2
默认情况下,参数值是使用let定义的(不能被改变)。这就是你的错误信息的原因——它与toPassAsParam()的结果无关。你可以通过两种方式解决这个问题,具体取决于你是否真的想在函数外部更改param1
如果你想让param1发生变化并保持其新值,请将其声明为inout [String:String]inout关键字意味着它可以从函数中进行更改)。
如果你只想在函数内部改变它,可以在函数的第一行写上var param1 = param1(将其复制到一个变量中)。
关于你问题的主题:你没有将一个函数作为参数传递。你将一个函数的返回值作为参数传递给另一个函数。如果你想将实际的函数传递给createDictionaryFromParams,它会像这样:
// note the type of `function`
func createDictionaryFromParams(function: () -> [String:String], 
                                param2: String, 
                                param3: String) -> [String:String] {
    var param1 = function() // now that we passed `function` in, we can call it to get a [String:String]
    param1["name"] = "John"
    param1["university"] = param2
    return [:]
}

0

我认为你的问题与将函数作为参数传递无关;你得到的错误是因为你试图更改函数参数时引发的,因为该参数被定义为let,要更改其值,你需要将它们变成var

所以你只需要将你的代码更改为以下代码:

func createDictionaryFromParams(param1: [String:String], param2: String, param3: String) -> [String:String] {

//here is changing constant to variable section
    var param1 : [String : String] = param1
    param1["name"] = "John"
    param1["university"] = param2
    return [:]
}
func toPassAsParam() -> [String:String] {
    //doStuff
    return [:]
}

public struct passFunction {
    let dict = createDictionaryFromParams(param1: toPassAsParam(), param2: "Texas", param3: "Florida")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接