在Swift中定义函数时,返回声明在括号内?会发生什么?

时间:2015-10-16 04:28:46

标签: swift function return

以下两个功能有什么区别?我把它们都输入了一个游乐场,但第二个函数没有输出任何内容。将-> Bool放在括号内侧而不是外侧时,这意味着什么?这是不正确的,因为我没有得到任何错误,但它也没有正确执行。我已经在函数中看到了这个使用完成处理程序,例如CLGeocoder.reverseGeocodeLocation(_:completionHandler:),但我不明白这意味着什么或如何正确使用它,如果有的话。

'正常'功能:

func aBasicFunction(string: String, anotherString: String) -> Bool {
    // things happen
    return true
}

我不明白的功能

func aWeirdFunction(string: String, anotherString: String -> Bool) {
    // things happen
    return true // I think? Is this function actually supposed to return a Bool?
}

上面的第二个函数在我的操场上没有做任何事情(在我的实际操场上它有一个print语句)但它也没有返回任何错误。

以下是CLGeocoder.reverseGeocodeLocation(_:completionHandler:)功能:

CLGeocoder.reverseGeocodeLocation(currentLocation!, completionHandler: { (placemarks, error) -> Void in
            if error == nil {
                print(error)
            }
    // more stuff...
    })

这可能是一个单独的问题,但我认为答案是相关的。 -> Void in是什么意思?它在这里返回什么(或者在这种情况下返回?

我也在使用Xcode 7(Swift 2)。谢谢!

3 个答案:

答案 0 :(得分:4)

在swift中,函数是一等公民,可以作为参数传递给其他函数。

函数类型由语法() -> ()定义。例如,您可以定义一个取整数的函数,并将其总和返回为(Int, Int) -> Int

当您定义一个接受另一个函数作为参数的函数时,您需要定义允许传入的函数类型。

你的功能:

func aWeirdFunction(string: String, anotherString: String -> Bool) {
    // things happen
    return true 
}

需要两个参数:类型string的{​​{1}}和String类型的anotherString,它实际上是一个函数,而不是String。由于您传递的是函数而不是字符串,因此应将参数名称重命名为(String) -> Boolcomplete或其他函数名称。

callback

然后,您可以将其用作:

func aWeirdFunction(string: String, complete: String -> Bool) {
    // things happen
    // return true <-- Nothing to return, actually
    complete("some string")
}

在Swift中,当最后一个参数是函数时,你可以简化语法:

aWeirdFunction("hello", complete: { response -> Bool in 
  print(response) // <-- prints "some string"
  return true // must return a boolean 
})

您还可以命名传递函数的参数:

aWeirdFunction("hello") { response -> Bool in 
  print(response) // <-- prints "some string"
  return true // must return a boolean 
}

并允许具有多个参数的函数:

func aWeirdFunction(string: String, complete: (anotherString: String) -> Bool) {
    // things happen
    // return true <-- Nothing to return, actually
    complete(anotherString: "some string")
}

aWeirdFunction("hello") { anotherString -> Bool in 
  print(anotherString) // <-- prints "some string"
  return true // must return a boolean 
}

最后,您可以作为参数传递的函数也可以具有返回值。在您的示例中,您指定要传递的函数必须返回func aWeirdFunction(string: String, complete: (anotherString: String, total: Int) -> Bool) { // things happen // return true <-- Nothing to return, actually complete(anotherString: "some string", total: 100) } aWeirdFunction("hello") { (anotherString, total) -> Bool in print(anotherString, total) // <-- prints "some string", 100 return true // must return a boolean } ,因为您的类型为Bool。以下是您将如何使用它:

(String) -> Bool

希望有所帮助!

加成

如果您发现其中一个方法具有复杂的函数类型参数,或者您的许多方法需要相同的函数类型,则可以创建func aWeirdFunction(string: String, complete: (anotherString: String, total: Int) -> Bool) { // things happen // return true <-- Nothing to return, actually let result = complete(anotherString: "some string", total: 100) if result { print("result is true!") // prints "result is true" } } aWeirdFunction("hello") { (anotherString, total) -> Bool in print(anotherString, total) // <-- prints "some string", 100 return true // must return a boolean } ,这会增加很多清晰度:

typealias

答案 1 :(得分:2)

您的第一个功能是返回&#34; Bool&#34;。

的功能
func aBasicFunction(string: String, anotherString: String) -> **Bool** {
    // things happen
    return true
}

你的第二个函数是一个什么都不返回的函数,它需要两个名为string和anotherString的参数。这里为函数分配了另一个字符串,在调用aWeirdFunction时必须传递该函数。 anotherString接受函数/闭包,它接受类型&#34; String&#34;的输入参数。并将返回布尔。

func aWeirdFunction(string: String, anotherString: String -> Bool) {
    // things happen
    anotherString("Hello") // Calls the function which was passed as parameter
    return true 
}

这样称呼,

aWierdFunction("Hello", { str:String -> Bool in
print(str)
return true
})

要了解有关关闭的更多信息,请访问 - More on Closure HTH。

答案 2 :(得分:0)

- 我只是简单地用这种方式引用东西......

在Swift中使用两种方式实现回调机制:

- Delegates

- Closures

您刚刚体验的是Callback使用Closure

示例:

internal func calculateSum(numberOne: Int, numberTwo: Int, completion: (sum: Int)-> Void)
{
    let total = numberOne + numberTwo
    // putting the value into the completion handler, so its avail at the caller side
    completion(sum: total)
}


calculateSum(5,  5) { (sum) -> Void in
    print(sum)
}