swift闭包_002_swift闭包

Posted 爱你久久

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift闭包_002_swift闭包相关的知识,希望对你有一定的参考价值。

//: Playground - noun: a place where people can play

import UIKit

//-----闭包-------//
//是独立的代码块,可以代码中进行传递和使用
//swift中的闭包和OC中的block相似
//函数是一种特殊的闭包,是有名称的闭包

//1.基本使用
/*
闭包的语法:
{ (参数1,参数2) -> 返回值类型 in
    闭包的代码
}
*/
func add(a:Int, b:Int) -> Int {
    
    return a + b
    
}

let closure = {(a:Int, b:Int) -> Int in
    
    return a + b
}

add(1, b: 2)
closure(1, 2)

//闭包的类型就是函数类型
let closure2 : (Int, Int)->Int = {(a:Int, b:Int) -> Int in
    
    return a + b
}
//闭包语法的简化,如果想省略闭包中参数和返回值的类型则需要显式的指定闭包变量的类型
let closure3 : (Int, Int)->Int = {a,b in
    return a + b
    
}

//单表达式引式返回:如果闭包的代码中只有一个表达式,则return可以省略
let closure4:(Int, Int)->Int = {a,b in a + b}
closure4(10,5)

//参数名也可以省略
let closure5:(Int, Int)->Int = {$0 + $1}
closure5(1,2)

//2.分别用函数和闭包实现数组中元素的遍历(对数组中每个元素执行某段代码)
func emnumerateArray(array : [Int], function: (Int) -> Void) {
    
    for item in array {
        function(item)
    }
}

//每个元素将要执行的函数
func printItem(var item: Int) {

    item++
    print(item)
}

let array = [1, 2, 3, 7]
//emnumerateArray(array, function: printItem)

let closure6 = { (item: Int) -> Void in
    print(item)
}

emnumerateArray(array, function: closure6)

emnumerateArray(array, function: { (item: Int) -> Void in
    print(item)
    }
)

//3.尾随闭包:如果闭包是最后一个参数,可以把闭包表达式写在函数参数()的后面,用来增加代码可读性
emnumerateArray(array) { (item : Int) -> Void in
     print(item)
}


//4.闭包捕获值
func makeIncrement(forIncrementor amount: Int) -> (Void)->Int {
    
    var total = 0
    
    //嵌套函数可以捕获外部函数的变量或者常量
//    func incrementor() -> Int {
//        
//        total += amount
//        print("total = \(total)")
//        
//        return total
//    }
//    
//    return incrementor
    
    //闭包可以捕获外部定义的变量或者常量
    let incrementor1 : (Void)->Int = {  (Void)->Int in
        
        total += amount
        print("total = \(total)")

        return total
        
    }
    
    return incrementor1
    
    
}

let closure7 = makeIncrement(forIncrementor: 2)
closure7()
closure7()

//闭包是引用类型
let closure8 = makeIncrement(forIncrementor: 3)
closure8()
closure8()

let closure9 = closure8
closure9()

var a = 0 //Int
var b = a
a = a + 1

print(b)

 

以上是关于swift闭包_002_swift闭包的主要内容,如果未能解决你的问题,请参考以下文章

swift--闭包

从 Objective C 将回调/闭包转换为 Swift

Swift 4:转义闭包只能通过值显式捕获 inout 参数

为啥速记参数名称在这个 Swift 闭包中不起作用?

swift - 闭包 -定义和使用

在 Swift 中遇到完成处理程序和闭包问题