★学习笔记:《iOS高级:Swift入门精讲②》第一节 Swift编程-01➡06 默认参数值

前言:

本篇为视频学习笔记

默认参数值(Default Parameter Value)

★ 参数可以有默认值

 func check(name: String = "nobody", age: Int, job: String = "none") {
     print("name=\(name),age=\(age), job=\(job)")
 }
 
 check(name: "Jack", age: 20, job: "Doctor") // name=Jack, age=20, job=Doctor
 check(name: "Rose", age: 18)                // name=Rose, age=18, job=none
 check(age: 10, job: "Batman")               // name=nobody, age=10, job=Batman
 check(age: 15)                              // name=noboby,age=15,job=none

上边是一个check函数,有三个参数name、age、job,我们会发现name、job有默认值,分别是nobody、none。那么,这是什么意思呢?

首先,先看第一个,三个参数都有传值,那么jack就赋值给name,20就赋值给age,Doctor就会赋值给job。到时候,打印出来就是,我们传进去的三个:name=Jack, age=20, job=Doctor

我们看第二个,也可以不传job,只传一个name和age。为什么只传这两个呢?因为job是有默认值的。也就意味着job,第三个参数你不传的话,它就直接用none这个值,那么最后打印出来的就是: name=Rose, age=18, job=none

第三个,我们传了age、job第一个参数,我们没有传,那么name没有传就是noboby,打印出来就是 name=nobody, age=10, job=Batman

第四个,左右两个我们都没传,只传了一个age,那也就意味着打印出来就是:name=noboby,age=15,job=none

★ C++的默认参数值有个限制: 必须从右往左设置。由于Swift拥有参数标签,因此并没有此类限制。

扩展

 // 第一种情况:C++正常编译可以通过
 void test(int a = 2, int b = 3, int c = 4, int d = 5) {
     
 }
 
 
 // 第二种情况C++不能编译通过
 // 原因:要求默认参数值,必须从右边开始
 void test(int a = 2, int b, int c, int d = 5) {
     
 }
 
 // 第三种情况C++可以编译通过,
 // 如果想设置下一个 必须先设置c的默认值,不能跳过这个c给b去设置
 // 只能从右边开始顺序 d->c->b->a
 void test(int a, int b, int c, int d = 5) {
     
 }

 void test(int a = 2, int b, int c, int d = 5) {
     
 }
 
 test()

如上,我们想调取test,这时,a和d是有默认值的,那你可能想a、d有默认值,那么接下来我们只传两个比如说test(11,22);你可能理所当然额认为11、和22,分别传给了b和c。不是的。按照函数的话,它肯定是对号入座,11给a,22给b。所以,函数调用,C++传参是对号入座的11给a,22给b。这样思考一下,这不就导致c没有值了,所以它编译失败。但是,你认真思考一下,如果你的默认参数是从右边往左设置的。假设void test(int a, int b, int c = 2, int d = 5) 到时候你传11、22 就会对号入座,11给a,22给b,c、d本来就有,所以它不会报错。

为什么swift没有这个限制呢?因为swift有这个参数标签,因为C++没有参数标签这个概念,所以它调用函数传参的时候,默认从左到右对号入座。但是在swift中,就会不一样,怎么一个不一样法呢?思考一下,传参的时候,他是有一个标签的,它要写清楚这个参数是给谁

★ 但是在省略参数标签时,需要特别注意,避免出错

swift是由于有参数标签的,没有C++的限制,意味着它不报错,是有标签,但是标签是可以省略的,那么一旦省略标签,那就类似于C++了

 // 这里的middlek不可以省略参数标签
 func test(_ first: Int = 10, middle: Int, _ last: Int = 30) { }
 test(middle: 20)

注意看第一个和最后一个都写了一个下划线,也就说白了first、last在写的时候,可以不写标签,那你思考一下,如果中间middle你也写一个下划线,那么代码就会报错,思考一下,为什么?

那就意味着这三个参数,都是带下划线的。意味着,我们传参数的时候都不用带标签如:test(10,20,30)。思考一下,first、last都是有默认值的,我们传一个参数是不是给middle呢?test(10),你觉的到时候会给middle吗?不会的,由于这三个都没有标签,那你传参的时候,肯定是按顺序传,说白了跟C++一样。10就会传给first这个家伙导致middle没有值,就会报错。所以,middle不可以省略标签。所以你想传一个值通过test(middle:20)传。

再省略标签的时候,一定要保证调用这个函数的时候,所有参数都有值的,就是能对号入座,每个参数都有值的。这样就不会报错了。

你可能感兴趣的:(★学习笔记:《iOS高级:Swift入门精讲②》第一节 Swift编程-01➡06 默认参数值)