将内联函数定义作为输入参数传递给函数

时间:2014-07-07 03:32:28

标签: function swift

说,我有一个函数接受函数作为输入参数之一:

// 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
})

尝试哪个编译器抱怨:(

如果我做错了,请建议。

2 个答案:

答案 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 })

请参阅http://fuckingswiftblocksyntax.com