浅谈swift中的函数类型和闭包

在讲swift的函数类型之前,我们先回忆一下我们以前学的定义一个swift的函数

func add(a: Int,b: Int) -> Int {
    return a + b
}

好了, 我们开始我们函数类型的讲解

上面这个函数的类型是(Int ,Int)->Int

使用函数类型

我们都知道, 在swift中 , 函数类型就像其他数据类型一样,也就意味着我们可以给一个函数的常量或者是变量赋值

var f2: (Int,Int)-> Int = add

f2(2,3)  //结果为5

好了,接下来,我们来看一下函数类型比较的事例,首先,作为函数, 我们可以把作为参数传递给另一个函数

首先呢, 我们先定义一个接口

protocol ProcessInt {
    func guolv(data: Int)->Bool
}

函数主体内容

func processArray2(chulizhe: ProcessInt) ->[Int] {
    //求数组内为偶数的值    let array = [1,8,7,3]
    var result:[Int] = []
    for item in array{
        if chulizhe.guolv(item) {
            result.append(item)
        }
    }
    return result

}

要作为参数传入的函数

class OuShu: ProcessInt {
    func guolv(data: Int)->Bool{
        return data % 2 == 0
    }
}

调用函数

processArray2(OuShu())    // 结果为8

好了, 函数类型就介绍到这里,就下来就是闭包的介绍了。。。

闭包:功能性自包含模块,可以在代码中被传递和使用,闭包是引用类型。

闭包可以”理解“通过下面的类实例化出来的一个对象

1.闭包是一个对象,是个引用类型

2.闭包是一个函数类型的对象

闭包表达式的语法

{(参数,参数) -> 返回类型 in}

下面的闭包表达式示例使用 sort 函数对一个 Int类型的数组进行升序(降序),以下是初始数组值:

let array = [20,1,2,8,3,9]

排序函数有两个参数:

  • 已知类型值的数组。
  • 一个闭包,采用相同类型的数组的内容的两个参数,并返回一个布尔值来表示是否将第一个值在排序时放到第二个值的前面或是后面。如果第一个值应该出现第二个值之前,闭包需要返回true,否则返回false。  
  • func compare(a: Int,b: Int ) -> Bool {
        return a < b
    }
    array.sort(compare)   //[1,2,3,8,9,20]

该例子对一个 Int类型的数组进行排序,因此排序闭包需为 (Int, Int) -> Bool 类型的函数。

闭包表达式,不需要额外定义函数

以下几种写法都可以达到排序的效果

1.通过调用array.sort()可以达到排序的效果

let resu = array.sort({(a:Int , b :Int) -> Bool in return a < b } )
resu   //[1,2,3,8,9,20]

let result2 = array.sort({(a: Int,b: Int)->Bool in return a > b })
result2  //[20,9,8,3,2,1]

2. 通过参数类型与返回类型的推断

let result3 = array.sort({(a,b) in return a > b })
result2  //[20, 9, 8, 3, 2, 1]

3.单行代码自动会返回此代码的结果

let result4 = array.sort({(a,b) in  a > b })
result4  //[20, 9, 8, 3, 2, 1]

4自动提供简短的参数名 $0,$1,$2....

let resu4 = array.sort({$0>$1} )  //[20, 9, 8, 3, 2, 1]

5.如果一个函数(sort),它只有一个参数,此参数的类型是函数类型,那么可以把大括号中得内容放到小括号外面

let result5 = array.sort(){
    $0 > $1
}
result2   //[20, 9, 8, 3, 2, 1]

捕获

闭包可以在其定义的上下文中捕获常量或变量。 即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。

Swift最简单的闭包形式是嵌套函数,也就是定义在其他函数体内的函数。 嵌套函数可以捕获其外部函数所有的参数以及定义的常量和变量。

func funcFactory() ->() ->Int {
    var total = 0

    func innerFunc() -> Int {
        total = total + 1
        return total
    }
    return innerFunc

}
let r1 = funcFactory()
r1()   //1
r1()  //2

每次调用这个函数时,total都会自加1,好了,闭包介绍到这里就结束了

时间: 2024-12-28 06:12:26

浅谈swift中的函数类型和闭包的相关文章

浅谈swift中的内存管理

Swift使用自动引用计数(ARC(Automatic Reference Count))来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 内存管理:针对的是实例的内存占用的管理(放在堆里面) 实例:1:由class类型构建的实例,2:闭包对象 下面我们来写一个实例来证明一下 class Person { var name: String init(name: String )

浅谈swift中的那些类,结构以及初始化的操作

首先呢,我们先声明一个类 class Parent { //声明一个属性 var p1: String = "abc" //声明一个方法 func m() { print("parent m") } //声明一个静态的方法 final func n(){ } } 然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new 一个的话, 直接调用该类就可以了) var par = Parent() 调用parent的方法和属性 par.m()

浅谈 Swift 中的泛型

Objective-C缺乏一个重要特性:不支持泛型.幸运地是,Swift拥有这一特性.泛型允许你声明的函数.类以及结构体支持不同的数据类型. 提出问题 优秀的泛型使用案例中,最常见的例子当属对栈(Stack)的操作.栈作为容器有两种操作:一.压入(Push)操作添加项到容器中;二.弹出(Pop)操作将最近添加项从容器移除.首先我们用非泛型方式设计栈.最后代码如下所示: 1234567891011121314 class IntStack{ // 采用数组作为容器保存数据 类型为Int priva

浅谈C#中的值类型和引用类型

在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识. 首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.从而这两种类型存储在内存的不同地方. 其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的

【.Net】浅谈C#中的值类型和引用类型

在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个概念从而在编程过程中遇到了很多问题,在这里博主浅谈对值类型和引用类型的认识. 首先从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.从而这两种类型存储在内存的不同地方. 其次从内存空间上看,值类型是在栈中操作,而引用类型则在堆中分配存储单元. 栈在编译的时候就分配好内存空间,在代码中有栈的

浅谈Kotlin中的函数

本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UV23Uw_969oVhiOdo4ZKAw作者:连凌能 Kotlin,已经被Android官方宣布 kotlin first 的存在,去翻 Android 官方文档的时候,发现提供的示例代码已经变成了 Kotlin.Kotlin的务实作风,提供了很多特性帮助开发者减少冗余代码的编写,可以提高效率,也能减少异常. 本文简单谈下Kotlin中的函数,包括表达式函数体,命名参数,默认参数,顶层函数

浅谈 Swift 中的 Optionals

input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.form-horizontal .form-group-sm input

浅谈swift中的那些结构体和枚举

首先呢, 我们先写一个struct struct Point { var x = 0 var y = 1 mutating func change (newX:Int,newY: Int) { x = newX y = newY } } var p1 = Point(x: 4, y: 4) p1.x //4   在这里呢,可能有人会问,为什么在func前面要加一个mutating, 如果不加的话, 编译器抛出错误,报出不能在实例方法中修改属性值 所以呢, 我们必须如果想改变成员变量的话, 就必须

浅谈html中的元素类型

一.元素的分类 根据css显示分类,XHTML元素被分为 三种类型:块状元素,内联元素,可变元素 1.块级元素特点 a.块状元素在网页中就是以块的形式显示,所谓块状就是元素显示为矩形区域, B:默认情况下,块状元素都会占据一行,通俗地说,两个相邻块状元素不会出现并列显示的现象:默认情况下,块状元素会按顺序自上而下排列. C:块状元素都可以定义自己的宽度和高度. D:块状元素一般都作为其他元素的容器,它可以容纳其它内联元素和其它块状元素.我们可以把这种容器比喻为一个盒子. 2.内联元素(inlin