swift3 函数和闭包
一、swift函数和objectc函数的参数区别
swift: func great(name: String, day: String) -> String {}
objectc: (NSString *)great:(NSString *)name day:(NSString *)day {}
通过两个的对比可以看出:1、swift的返回类型是放在参数列表的右边,使用->returnType 的方式。而objectc则使用常规的returnType 放在函数名的左边的方式;2、swift的参数格式为 paramName:type 的方式, 而objectc则比较麻烦 paramName:(type)param
但是他们函数的调用都是一样的参数名:参数值 great(name:xxx, day:yyy)
二、可以有多种返回类型
元组:-> (param1, param2, ...)
函数:-> (Int -> Int), -> ((Int, Int) -> Int) .......
等各种类型
三、参数可变
func sumOf(numbers: Int...) -> Int { var sum = 0 for number in numbers { sum += number } return sum } sumOf(numbers: 1,2,3,5)
func sumOf(numbers: Int..., name: String) -> Int { print(name) var sum = 0 for number in numbers { sum += number } return sum } sumOf(numbers: 1,2,3,5, name:"kkqqq")
闭包:
使用{}创建闭包,闭包内使用in将函数的参数返回值和函数体分割开,如下所示
var f = { (number: Int) -> Int in var result: Int = number for i in 1...10 { result += i } return result }
则可以用f(5) 调用;
之前说的调用要有参数名,如:great(name:xxx, day:yyy)
那么闭包是否可以也用参数名呢?f(number: 5)
这样子调用的话则会出现如此的报错: Extraneous argument label 'number:' in call
也就是说这里的闭包不能增加参数名, 因为f只是单纯的一个名称,无任何的参数
这么解释的话,那么如果我使用: var f:(number: Int) -> Int = {
是不是就可以了呢? 如果这么写,依旧会报错: Function types cannot have argument labels; use '_' before 'number'
从这几种可能也说明了调用闭包是不能增加参数名的
一、逃逸闭包
当我们进行多线程调用,并使用了传入的闭包函数的时候,这时候正常需要用到逃逸闭包;因为当一个函数调用结束,这个闭包还在多线程中,还没执行到;如果不设置为逃逸闭包则此时这个闭包也已经被释放,当多线程要执行该闭包时候该闭包已经不存在了
func loadData(completion: @escaping () -> Void) { print("当前线程\(Thread.current)") DispatchQueue.global().async { print("当前线程\(Thread.current)") Thread.sleep(forTimeInterval: 1) completion() print("异步线程结束") } print("loadData return") } loadData( completion: {() -> Void in print("逃逸") } )
二、自动闭包
自动闭包在下面的链接中有说明,这里就不再说了。具体说个我遇到的问题
func test(_ closure: @autoclosure () -> Bool) { if closure() { print("test is true") } if closure() { print("true true") } else { print("false false") } } var flag = 10 test ({ () -> Bool in print("try flag") if flag <= 10 { flag += 1 return true } return false }())
注意看我标红色的位置,自动闭包后面加括号,如果不加括号会提示错误;具体为啥,我也不懂,望路过同学帮忙解答
解答:
1、自动闭包不接受任何形式的参数(只能是无参)
2、标红色之后则可以看成是表达式,否则只能看成是一个函数;然后自动闭包在执行的时候会返回表达式的值;(在自动闭包执行的时候才执行该表达式)
其他具体闭包的说明可以看此链接:https://blog.csdn.net/qq_29909323/article/details/73327966