以下两个功能有什么区别?我把它们都输入了一个游乐场,但第二个函数没有输出任何内容。将-> 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)。谢谢!
答案 0 :(得分:4)
在swift中,函数是一等公民,可以作为参数传递给其他函数。
函数类型由语法() -> ()
定义。例如,您可以定义一个取整数的函数,并将其总和返回为(Int, Int) -> Int
当您定义一个接受另一个函数作为参数的函数时,您需要定义允许传入的函数类型。
你的功能:
func aWeirdFunction(string: String, anotherString: String -> Bool) {
// things happen
return true
}
需要两个参数:类型string
的{{1}}和String
类型的anotherString
,它实际上是一个函数,而不是String。由于您传递的是函数而不是字符串,因此应将参数名称重命名为(String) -> Bool
或complete
或其他函数名称。
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)
}