美文网首页iOS开发iOS Developer程序员
Swift闭包的一些简单用法

Swift闭包的一些简单用法

作者: 戴维营教育 | 来源:发表于2016-08-16 12:28 被阅读335次

    与Objective-C相比,同是苹果公司御用开发语言的Swift明显在语法上要复杂很多,并且同一个语法功能的写法也非常多,有时会带来很多困惑。本文主要关注闭包的用法。Swift的闭包与在Objective-C 2.0的时候就引入的Block语法功能类似,都是一个能够捕获变量的可执行实体。

    实际使用中,Block的语法都中规中矩:

    //定义闭包类型
    typedef void (^BlockType)();
    //创建闭包类型的变量
    void (^blockVar)();
    //创建闭包,简化写法
    blockVar = ^{
      NSLog(@"Block");
    };
    

    可以看出来,不管是定义闭包还是创建闭包,都是很规则的形式,用^开头,包含参数列表、返回值类型等。

    但作为Swift的重点语法闭包来说,就没这么简单了。它在不同场合可以有不同形式的简写,下面用示例来说明。

    1. 完整形式

    //定义闭包类型
    typealias ClosureType = (Int, Int) -> Int
    
    //定义闭包类型变量并创建闭包
    var c1: ClosureType = {
        (a: Int, b: Int) -> Int in
        
        return a + b
    }
    
    //调用闭包
    c1(1, 2)
    

    完整的闭包包括参数列表和返回值类型,实现的时候全部放入{ }中,并且用in关键字隔开返回值类型和可执行代码。

    2. 简写的闭包创建方式

    Swift相比Objective-C拥有更加强大的推导能力,因此在类型已知的情况下,可以省略许多代码。比如在闭包类型一定的情况下,可以省略返回值类型、参数列表等。

    a. 省略返回值类型

    //定义闭包类型
    typealias ClosureType = (Int, Int) -> Int
    
    //定义闭包类型变量并创建闭包
    var c1: ClosureType = {
        (a: Int, b: Int) in
        
        return a + b
    }
    

    由于c1已经确定拥有整型Int返回值,因此可以在实现闭包的时候不写。

    b. 省略参数类型

    //定义闭包类型
    typealias ClosureType = (Int, Int) -> Int
    
    //定义闭包类型变量并创建闭包
    var c1: ClosureType = {
        (a, b) in
        
        return a + b
    }
    

    实际上连参数列表的圆括号也是可以省略的:

    //定义闭包类型变量并创建闭包
    var c1: ClosureType = {
        a, b in
        
        return a + b
    }
    

    Swift还提供了位置参数的用法,可以用参数的位置来代替参数名称:

    //定义闭包类型变量并创建闭包
    var c1: ClosureType = {
    
        return $0 + $1
    }
    

    如果整个闭包中只有一个有计算结果的语句,并且它的类型与返回值类型相同,甚至可以省略return

    //定义闭包类型变量并创建闭包
    var c1: ClosureType = {
        $0 + $1
    }
    

    3. 作为函数参数的简写形式

    闭包可以作为函数参数,并且在作为函数的最后一个参数时,能够获得额外的简写方式。

    a. 完整形式

    //定义闭包类型
    typealias ClosureType = (Int, Int) -> Int
    
    //定义使用闭包作为参数的函数
    func compute(a: Int, b: Int, c: ClosureType) {
        print(c(a, b))
    }
    
    //调用函数
    compute(a: 1, b: 2, c: {
        (a: Int, b: Int) -> Int in
        
        return a * b
    })
    

    b. 简单省略形式

    //调用函数
    compute(a: 1, b: 2, c: { $0 * $1 })
    

    c. 作为最后一个参数,可以不写到圆括号中

    //调用函数
    compute(a: 1, b: 2) { 
        $0 * $1 
    }
    

    d. 如果函数只有一个参数,则连圆括号都可以省略

    //定义使用闭包作为参数的函数
    func compute(c: ClosureType) {
        print(c(1, 2))
    }
    
    //调用函数
    compute { 
        $0 * $1 
    }
    

    这种形式在大量知名的开源框架中都有体现,比如PromiseKit中的firstlythenwhen等函数。

    UIApplication.sharedApplication().networkActivityIndicatorVisible = true
    
    firstly {
        when(NSURLSession.GET("http://api.class.room/?method=provs").asArray())
    }.then { (array) in
        print(array)    
    }.always { 
        UIApplication.sharedApplication().networkActivityIndicatorVisible = false
    }.error { (error) in
        print(error)
    }
    

    4. 总结

    合理使用Swift闭包的各种形式,结合函数的参数、返回值等,能够让代码变得更加简洁、表现力更强,但同时会让学习取消变得更加陡峭。

    相关文章

      网友评论

        本文标题:Swift闭包的一些简单用法

        本文链接:https://www.haomeiwen.com/subject/cgjpsttx.html