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

 

posted @ 2022-04-11 23:54  LCAC  阅读(159)  评论(0编辑  收藏  举报