说,我有一个函数接受函数作为输入参数之一:
// modify passed string
func modifyString(paramString: String, modificationFunction: String -> String) -> String {
return modificationFunction(paramString)
}
现在我可以定义一个这样的函数:
func addLearningSuffix(inputString: String) -> String {
var returnString = inputString + " is learning swift"
return returnString
}
并像这样使用它:
// adds suffix - is learning swift
modifyString("Miraaj", addLearningSuffix) // returns "Miraaj is learning swift"
在上面的例子中,我只是将函数名称 - addLearningSuffix 作为输入参数传递给函数 - modifyString ,但是如果我想在传递的同一行中定义函数怎么办?它作为输入参数。
我知道函数是闭包的特例,所以我可以像这样传递内联闭包:
// adds prefix - Miraaj
modifyString("is learning swift",{
(inputString: String) -> String in
let result = "Miraaj " + inputString
return result // returns "Miraaj is learning swift"
})
或者像这样:
modifyString("is learning swift"){
(inputString: String) -> String in
let result = "Miraaj " + inputString
return result
}
但为什么我不能像这样传递内联函数定义:
modifyString(" is learning swift", func addSomeOtherPrefix(inputString: String) -> String{
return "Miraaj" + inputString
})
尝试哪个编译器抱怨:(
如果我做错了,请建议。
答案 0 :(得分:5)
考虑声明对象然后使用它之间的区别:
var a = 100
abs(a)
直接使用它:
abs(100)
在声明然后使用函数之间存在相同的差异:
func talk(x: String) { return x + " is talking" }
doThis(talk)
直接使用它:
doThis( { x: String -> return x + " is talking" } )
书写
doThis( func talk(x: String) { return x + " is talking" } )
就像写作
abs(var a = 100)
没有意义。
答案 1 :(得分:0)
你可以,但避免使用func
关键字,也就是说,避免声明一个有趣的,但使用闭包的匿名性质:
modifyString(" is learning swift", { inputString in "Miraaj" + inputString })