使用if-let和尾随闭包

时间:2014-12-11 20:39:00

标签: swift ios8 closures

我有一个功能,例如:

func myFunction(aString: String, aClosure: (intArg: Int) -> (Void)) -> String? {
    aClosure(intArg: 1)
    return aString
}

我故意简单地表达我的问题。我有两个问题。首先,有一个更好的方法来使用带有尾随闭包的函数:

if let newString = (myFunction("hello world") {
    (intArg: Int) -> Void in
        println("Do nothing")
    }) {
    println(newString)    
}

我不想在函数调用周围放置那些额外的括号。

我的第二个问题 - 为什么"什么都不做"没打印?

3 个答案:

答案 0 :(得分:2)

如果你真的想要内联闭包,我发现回到把尾随闭包放在函数括号中比在括号中包装整个函数+闭包更好。

所以:

if let newString = myFunction("hello world", { _->() in println("Do nothing") }) {
    println(newString)
}

而不是:

if let newString = (myFunction("hello world") { _->() in println("Do nothing") }) {
    println(newString)
}
如果我将代码粘贴到游乐场中,

Do nothing打印得很好 - 尽管只在时间轴(cmd-opt-enter)中,而不是在右边缘。

答案 1 :(得分:1)

我操纵它并以原始方式完成它并且它在我的项目打印中无效,但它仍然显示沙箱中的(0个元素)。但是,当我检查沙盒中的控制台输出时,它确实显示出来:

enter image description here

if let newString = myFunction("hello world", {
    (intArg: Int) -> Void in
    println("Do nothing")
}) {
    println(newString)
}

答案 2 :(得分:0)

我的解决方案是使用if-let部分正上方定义的本地函数或闭包。代码:

// the local function
func completion(intArg: Int) {
    println("Do nothing")
}

// or closure

let completion: Int -> () = {_ in println("Do nothing")}

if let newString = myFunction("hello world", completion) {
    println(newString)
}
  

我的第二个问题 - 为什么“什么都不做”没有印刷?

也许您没有在completion

内拨打myFunction