设为首页 加入收藏

TOP

窥探Swift之函数与闭包的应用实例(二)
2017-10-10 12:18:33 】 浏览:8312
Tags:窥探 Swift 函数 包的 应用 实例
己的所属类型,函数类型说白了就是如果两个函数参数列表相同以及返回值类型相同,那么这两个函数就有着相同的函数类型。在Swift中可以定义一个变量或者常量来存储一个函数的类型。接下来将用过一个实例还介绍一下函数类型是个什么东西。

 (1) 首先创建两个函数类型相同的函数,一个函数返回两个整数的差值,另一个函数返回两个整数的乘积。当然这两个函数比较简单,直接上代码:

1 //现定义两个函数类型相同的函数
2 func diff (number1:Int, number2:Int) -> Int {
3     return number1 - number2;
4 }
5 
6 func mul (number1:Int, number2:Int) -> Int {
7     return number1 * number2;
8 }

    

(2) 函数定义好后,接着要定义个一个枚举来枚举每种函数的类型,下面定义这个枚举在选择函数时会用到,枚举定义如下:

1 //定义两种计算的枚举类型
2 enum CountType:Int {
3     case DiffCount = 0
4     case MulCount
5 }

    

(3) 接下来就是把(1)和(2)中定义的东西通过一个函数来组合起来。说白了,就是定义个函数来通过枚举值返回这个枚举值所对应的函数类型。有时候说多了容易犯迷糊,就直接上代码得了。下方函数的功能就是根据传进来的枚举值来返回相应的函数类型。

 1 //选择类型的函数,并返回相应的函数类型
 2 func choiseCountType(countType:CountType) -> ((Int, Int) -> Int) {
 3     //函数类型变量
 4     var myFuncType:(Int, Int) -> Int
 5     
 6     switch countType {
 7     case .DiffCount:
 8         myFuncType = diff
 9     case .MulCount:
10         myFuncType = mul
11     }
12     return myFuncType;
13 }

    

(4) 接下来就是使用(3)中定义的函数了,首先我们需要定义一个相应函数类型((Int, Int) -> Int)的变量来接收choiseCountType()函数中返回的函数类型,然后调用该函数类型变量,在Playground中执行的结果如下:

 

      

4.函数嵌套

我们可以把 3 中的代码使用函数嵌套进行重写,在Swift中是支持函数嵌套的。 所以可以吧3.1和3.2中的函数放到3.3函数中的,所以我们可以对上述代码使用函数嵌套进行重写。使用函数嵌套重写后的代码如下所示,当然,choiseCountType()函数的调用方式没用发生改变,重写后的调用方式和3.4中的调用方式是一样一样的。

 1 //选择类型的函数,并返回相应的函数类型
 2 func choiseCountType(countType:CountType) -> ((Int, Int) -> Int) {
 3     
 4     //现定义两个函数类型相同的函数
 5     func diff (number1:Int, number2:Int) -> Int {
 6         return number1 - number2;
 7     }
 8     
 9     func mul (number1:Int, number2:Int) -> Int {
10         return number1 * number2;
11     }
12 
13     
14     //函数类型变量
15     var myFuncType:(Int, Int) -> Int
16     
17     switch countType {
18     case .DiffCount:
19         myFuncType = diff
20     case .MulCount:
21         myFuncType = mul
22     }
23     return myFuncType;
24 }

 

  

二. 闭包

说道Swift中的闭包呢,不得不提的就是Objective-C中的Block, 其实两者是一个东西,使用方式以及使用场景都是相同的。我们完全可以类比着Objective-C中的Block来介绍一下Swift中的Closure(闭包)。其实就是匿名函数。接下来的这段内容,先介绍一下Swift中Closure的基本语法,然后在类比着ObjC中的Block窥探一下Closure的使用场景。

    

1.Closure变量的声明

Closure就是匿名函数,我们可以定义一个闭包变量,而这个闭包变量的类型就是我们上面介绍的“函数类型”。定义一个闭包变量其实就是定义一个特定函数类型的变量,方式如下。因为Closure变量没有赋初始值,所以我们把其声明为可选类型的变量。在使用时,用!强制打开即可。

1 var myCloure0:((Int, Int) -> Int)?

      

除了上面的方式外,我们还用另一种常用的声明闭包变量的方式。那就是使用关键字typealias定义一个特定函数类型,我们就可以拿着这个类型去声明一个Closure变量了,如下所示

1 //定义闭包类型 (就是一个函数类型)
2 typealias MyClosureType = (Int, Int) -> Int
3 var myCloure:MyClosureType?

 

2. 给Closure变量赋值

给Closure变量赋值,其实就是把一个函数体赋值给一个函数类型的变量,和函数的定义区别不大。但是给闭包变量赋值的函数体中含有参数列表,并且参数列表和真正的函数体之间使用关键字in来分割。 闭包可选变量的调用方式与普通函数没什么两样,唯一不同的是这个函数需要用!来强制打开才可以使用。赋值和调用方式如下。

 

3. 闭包回调的应用实例

暂且先称作闭包回调吧,其实就是Objc中的Block回调。在Swift中的闭包回调和Objc中的Block回调用法一致,下方将会通过一个实例来介绍一下闭包的应用之一。下方会创建两个视图控制器,我们暂且称为FirstViewController和SecondViewController。在FirstViewController上有一个Label和一个Button, 这个Button用来跳转到SecondViewController, 而这个Label用来显示从SecondViewController中回调过来的值。 而SecondViewController也有一个TextField和一个Button, 点击Button就会把输入框中的值通过闭包回调回传到FirstViewController然后在FirstViewController上的Label显示。

      

(1) 构建这个实例的第一步要做的就是使用Stroyboard把我们所需的控件布局好,并且管理相应的类。当然我们这个Demo的重点不在于如何去布局控件,如何去关联控件,以及如何去使用控件,所以上述的这些就不做赘述了。这个实例的重点在于如何使用Closure实现值的回调。下方是我们的控件布局和目录结构的截图,从Storyboard上的控件来看,功能也就一目了然了。点击“FirstViewController” 上的“Go SecondV

首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇(IOS)BaiduFM 程序分析 下一篇(IOS)BaiduFM 程序分析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目