窥探Swift之函数与闭包的应用实例

        今天的博客比较基础。我们将讨论一下Swift中的函数和闭包。今天的一些小实例中将类比一下Objective-C中得函数得写法等。

Swift中的函数还是有许多好用的特性的,比如输入参数,使用元组返回多个值,定义形参名,设定默认参数以及可变参数等等一些

好用的特性。

        而在Swift中的闭包就是Objective-C中的Block,除了语法不通外,两者的用法是一样的。好吧,少说废话,直接进入主题,先

说说Swift中的函数,然后讲一下Swift中的闭包。

一、Swift中的函数

1.函数的定义和使用

在介绍Swift中的函数之前,先给出一段Objective-C的函数例子,求两个数的和

- (NSInteger)sumNumber1:(NSInteger)number1 1number2:(NSInteger)number2{

    

    return number1 + number2;

}

用Swift语法实现

 func sum(number1:Int,number2:Int)->Int{

            

    return number1 + number2

            

 }

Swift定义函数的基本语法就是: func 函数名形参列表) -> 返回值类型 { 函数体 }
上面函数的调用方法如下:

let sumTwoNumber = sum(3, number2: 4)

2.函数中的形参列表

关于函数中的形参列表还是有必要提上一嘴的,因为形参列表作为函数数据源之一,所以把参数列表好好搞一下还是很有必要的。

(1)默认的形参是常量(let)

   在函数的形参列表中,默认的形参是常量。也就是相当于用let关键字对形参进行修饰了。我们可以做个试验,把上面加函数做一个修改,在加法函数中对number1进行加1操作,你会得到一个错误,这个错误的大体意思就是“number1是不可修改的 ,因为它是let类型的常量”。并且编译器还会给出Fix-it(修复)的方法,就是在number1前面使用var关键字进行修饰,使其成为变量,这样才可以修改其值。

    总之,一句话“形参默认是常量,如果需要修改其变量,那么就使用var关键字进行修饰”(在Objc中默认可以修改函数形参的值)  

 

(2)给形参命名

为了代码的可读性和可维护性,我们在定义函数时,需要为每个参数名一个名字,这样调用者见名知意,很容易就知道这个参数代表什么意思了。接下来还是在上述加法函数中进行修改,为每个参数名一个名字,并看一下调用方式。修改上面的函数,给第一个形参命名成numberOne, 第二个形参为numberTwo, 下方是修改后的函数。 紧接着sum()函数的调用方式也会有所改变,在调用函数时编译器会给出参数的名称,这样调用者一目了然。

1
2
3
4
5
6
//函数定义
func sum (numberOne number1:Int, numberTwo number2:Int) -> Int{
     return  number1 + number2;
}
 
let sumTwoNubmer = sum(numberOne: 10, numberTwo: 20);

调用上述函数时,下方是编译器给出的提示,一目了然呢。

关于Swift中参数名的内容,要说明的是在Swift1.0的时候,你可以在参数前面添加上#号,然后参数名就与变量(或者常量)的名字相同,而Swift2.0后这个东西去掉了,因为默认就相当于Swift1.0中添加#号。

 (3) 函数的传参与传引用

先暂且这么说着,在C语言的函数中可以给函数传入参数,或者传入实参的内存地址就是所谓的传引用。如果传入的是引用的话,在函数中对值进行修改的话,那么出了函数,这个被修改的值是可以被保留的。在Swift中也是可以的,不过你需要使用inout关键字修饰形参,并且在使用该函数时,用&来修饰。这一点和C语言中类似,&就是取地址符。下方是inout使用的一个小实例。

1
2
3
4
5
  func incrementStepTwo (inout myNumber:Int) {
      myNumber += 2
  }
  var  myTestNumber = 6
  incrementStepTow(&myTestNumber)   //myTestNumber = 8

(4) 不定参数函数

不定参数函数也就是形参的个数是不定的,但是形参的类型必须是相同的。不定形参在使用时怎么取呢?不定个数的形参实际上是一个数组,我们可以通过for循环的形式来遍历出每个形参的值,然后使用就可以了。下方incrementMultableAdd()函数的形参的个数是不定的,其功能是求多个整数的和。在函数中我们只需遍历每个参数,然后把每个参数进行相加,最后返回所求的和即可。函数比较简单,再此就不在啰嗦了。


(5) 默认形参值

在Swift语言中是支持给形参赋初始值的,这一点在其他一些编程语言中也是支持的。但是Objective-C这么看似古老的语言中就不支持给形参指定初始值,在Swift这门现代编程语言中是支持这一特性的。默认参数要从参数列表后开始为参数指定默认值,不然就会报错。下方就是为函数的形参指定默认参数的示例。一个表白的方法sayLove(), 形参youName默认是“山伯”, 形参loverName默认是“英台”。 紧接着是sayLove函数的三种不同的调用方式,在调用函数时你可以不传参数,可以传一个参数,当然传两个也是没问题的。

因为函数的每个参数都是有名字的,在含有默认参数的函数调用时,可以给任意一个参数进行传值,其他参数取默认值,这也是Swift的一大特色之一,具体请看如下简单的代码示例:

3. 函数类型
   每个函数都有自己的所属类型,函数类型就是如果两个函数参数列表相同以及返回值类型相同,那么这两个函数类型就相同。在Swift中可以定义一个变量或者常量来存储一个函数的类型。接下来就用实例介绍一下函数类型是个什么东西

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

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

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

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

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

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

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

 

4.函数嵌套

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值