美文网首页
Swift~闭包

Swift~闭包

作者: 水中的蓝天 | 来源:发表于2020-06-14 17:35 被阅读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  ♣


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

闭包表达式

  • 在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数

闭包的格式:
{

(参数列表) -> 返回值类型  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

相关文章

  • Swift-闭包

    Swift 闭包 函数 ()->() Swift 中的闭包和 Objective-C 中的 block 类似,闭包...

  • Swift闭包和函数

    函数在Swift中只是一种特殊的闭包,闭包在Swift语言中是一等公民,支持闭包嵌套和闭包传递。Swift中的闭包...

  • swift4 闭包

    swift 闭包 闭包:swift 中 函数是闭包的一种类似于oc的闭包闭包表达式(匿名函数) -- 能够捕获上下...

  • Swift中的闭包

    在Swift中有两种闭包,逃逸闭包(@escaping)和非逃逸闭包(@nonescaping)。从Swift 3...

  • 100 Days of Swift - Day 06 - 闭包(

    100 Days of Swift - Day 06 - 闭包Closures 6.1 闭包 Swift函数也属于...

  • swift学习

    * 闭包 * 闭包作为属性 ```swift // 声明闭包类型 typealias callba...

  • iOS swift 逃逸闭包(@escaping)和非逃逸闭

    iOS swift 逃逸闭包(@escaping)和非逃逸闭包 (@noescaping) 逃逸闭包: 逃逸闭包...

  • iOS&Swift&OC 闭包和Block的相互转化

    一、Swift的闭包 -> OC的block 二、OC的block -> Swift的闭包

  • swift闭包学习

    闭包作为参数 参考 Swift学习之闭包

  • Swift学习笔记(1)

    SWift学习笔记 闭包 闭包表达式 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 ...

网友评论

      本文标题:Swift~闭包

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