查中是允许的。
func addTwoInts(a:Int,b:Int) ->Int{
return a+b
}
var mathFunction: (Int, Int) -> Int = addTwoInts
let a = mathFunction(4,5)
print("Result:\(a) \(mathFunction(2, 3))")
作为参数的函数
在 Swift 中,函数可以被用来当做变量传递。比如,一个函数可以含有一个函数类型的参数
func luckyNumberForName(name: String,lotteryHandl lotteryHandler: (String, Int) -> String) -> String {
let luckyNumber = Int(arc4random() % 100)
return lotteryHandler(name, luckyNumber)
}
func defaultLotteryHandler(name: String, luckyNumber: Int) -> String {
return "\(name), your lucky number is \(luckyNumber)"
}
luckyNumberForName("Mr. Roboto", lotteryHandl: defaultLotteryHandler)
// Mr. Roboto, your lucky number is 38
注意下只有函数的引用被传入 — 在本例中是 defaultLotteryHandler。这个函数之后是否执行是由接收的函数决定。
实例方法也可以用类似的方法传入:
func luckyNumberForName(name: String, lotteryHandl lotteryHandler: (String, Int) -> String) -> String {
let luckyNumber = Int(arc4random() % 100)
return lotteryHandler(name, luckyNumber)
}
class FunLottery {
func defaultLotteryHandler(name: String, luckyNumber: Int) -> String {
return "\(name), your lucky number is \(luckyNumber)"
}
}
let funLottery = FunLottery()
luckyNumberForName("Mr. Roboto", lotteryHandl: funLottery.defaultLotteryHandler)
// Mr. Roboto, your lucky number is 38
为了让你的函数定义更具可读性,可以考虑为你函数的类型创建别名 (类似于 Objective-C 中的 typedef):
typealias lotteryOutputHandler = (String, Int) -> String
func luckyNumberForName(name: String, lotteryHandl lotteryHandler: lotteryOutputHandler) -> String {
let luckyNumber = Int(arc4random() % 100)
return lotteryHandler(name, luckyNumber)
}
你也可以使用不包含参数名的函数 (类似于 Objective-C 中的 blocks):
func luckyNumberForName(name: String, lotteryHandl lotteryHandler: (String, Int) -> String) -> String {
let luckyNumber = Int(arc4random() % 100)
return lotteryHandler(name, luckyNumber)
}
luckyNumberForName("Mr. Roboto", lotteryHandl: {name, number in
return "\(name)'s' lucky number is \(number)"
})
// Mr. Roboto's lucky number is 74
在 Objective-C 中,使用 blocks 作为参数是异步操作是操作结束时的回调和错误处理的常见方式,这一方式在 Swift 中得到了很好的延续。