Swift~闭包

2020-06-14  本文已影响0人  水中的蓝天

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢。

嵌套类型

示例.png

枚举、结构体、类都可以定义方法


class Size {

    var width = 10
    var height = 10
    
    func show() {

    print("width=\(width), height=\(height)")

   }
}

let s = Size()
s.show() //width=10  height=10

----------------------------------------------------

struct Point {

    var x = 10
    var y = 10
    
    func show() {

    print("x=\(x), y=\(y)")

   }
}

let p = Point()
p.show() //width=10  height=10

--------------------------------------


enum PokerFace: Character {

    case spades = "♥", hearts = "♣"
    
     func show() {

      print("face is \(rawValue)")

    }
}

let pf = PokerFace. hearts
p.show() //face is  ♣


方法不论是定义在值类型、引用类型里面或者外面其都是存储在代码段的

闭包表达式


闭包的格式:
{

(参数列表) -> 返回值类型  in  函数体代码

}


var fn = {

   (v1:Int , v2:Int) -> Int in
   
   return v1 + v2

}

fn(10,20)

-------------------------------------

 {

   (v1:Int , v2:Int) -> Int  in
   
   return v1 + v2

}(10,20)

闭包表达式缩写

示例图.png

更加简写的方式


exec(v1: 10, v2: 20, fn: +)

尾随闭包

func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) {

print(fn(v1, v2))

}

--------------------------------------------

与上面代码等价
exec(v1:10, v2: 20) {

$0 + $1

}


 func exec(fn: (Int, Int) -> Int) {

print(fn(v1, v2))

}

--------------------------------------------
等价于上面代码

exec(fn: {$0 + $1})
exec() {$0 + $1}
exec {$0 + $1}

Array排序


官方定义
func sort(by areInIncreasingOrder: (Element, Element) -> Bool)

//返回true:    i0排在i1前面
//返回false:  i0排在i1后面
func cmp(i0: Int, i1: Int)->Bool {
    //大的排前面
    return i0 > i1
}

var arr = [10,3,4,20,90]

//从小到大排序
arr.sort()

//自定义排序规则:从大到小排序
arr.sort(by cmp(2,1))

//闭包表示
arr.sort{$0 > $1}

忽略参数


exec {
_ , _  in 20
}

表示不论传什么参数进来,都不管它;直接返回20
两个下划线表示两个参数


闭包(Closure)

这里的函数是指:一般定义在函数内部的函数;一般它捕获的是外层函数的局部变量、常量

注意:一旦捕获了外部的局部变量和常量形成闭包就会在堆空间申请内存;

外部变量捕获.png 示例.png 示例2.png

注意:如果返回值是函数类型,那么参数的修饰要保持统一

示例.png

自动闭包

自动闭包.png
上一篇下一篇

猜你喜欢

热点阅读