iOS入门小知识-Swift内外参数名

形参和实参

以OC为例,在方法的声明中,有不带参的,也有带参的,在调用带参方法的时候,参数可分为形参和实参,形参好比给参数起的一个名字,也叫参数名,形参在方法的声明中是没有值的,而实参则是带有具体值和默认值的。

/**
 *  @brief  求两个数的和
 *  @pragma  num1 形参1(第一个数)
 *  @pragma  num2 形参2(第二个数)
 *  @return  返回num1求和num2的结果
 */
int sum(int num1, int num2) {
    return num1 + num2;
}
/*
* 变量a,可作实参
* 变量b,可作实参
*/
int a, b;

实参的值可以是常量,可以是表达式,也可以是函数等。

int a = 1, b = 2;
int result = sum(a, b);//将变量作为实参
result = sum(6, 60);//将常量作为实参
result = sum(a+1, b*2);//将表达式作为实参
result = sum(ceilf(3.5), floorf(2.9));//将函数作为实参

在调用方法时,实参必须要是有值的,以便将值传递给形参,但形参的值不能逆向传给实参,换句话说,实参与形参值的传递是单向的,形参作用域只在方法内部有效,不能在方法外使用,所以形参值的改变并不能影响实参的值。

int sum(int num1, int num2) {
    NSLog(@"%@ = %d",S(num1),num1);
    num1 = num1 + num2;//形参num1的值在方法内部发生了变化
    NSLog(@"%@ = %d",S(num1),num1);
    return num1;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int a = 1,//a初始值为1
        b = 2;
        sum(a, b);//实参a传值给形参num1,实参b传值给形参num2
        NSLog(@"%@ = %d",S(a),a);
    }
    return 0;
}
~
运行结果打印:
num1 = 1
num1 = 3
a = 1

另外形参和实参是可以同名的,但是两者之前相互独立,互不影响,因为形参只在方法内部才是有效的。我们只要修改上述代码,就可以让形参和实参同名。

/**
sum(<#int num1#>, <#int num2#>)
*/
int num1 = 1,
num2 = 2;
sum(num1, num2);
~
运行结果打印:
num1 = 1
num1 = 3

Swift函数内外参数名

swift在调用函数时形参和实参就不多说,但在定义函数时参数名分为内部参数名和外部参数名。
不难理解,内部参数名就是给函数内部使用的参数起的名字,而外部参数名就是供函数使用者做参数理解参考给参数起的名字。

//根据长宽求几何图形的面积
func area(width w : Float, height h : Float) -> Float {
    //
    /*
     外部函数名主要是用于给使用者一个理解参考,比如函数参数的基本含义,可能的用途
     这里是一个求面积的函数,width和height对于使用着来说,很容易理解这里的width就是几何图形的长,height就是几何图形的宽,长x宽=面积
     w和h作为内部参数名,其实准确的说是用来存储值的,好比上述说到的形参,并且函数内部不能使用外部参数名,但有一种情况除外,就是内外参数同名时
     */
    let value : Float = w * h
    return value
}
在OC方法实现中调用swift的area函数是这样子的:
[swiftVC areaWithWidth:<#(CGFloat)#> height:<#(CGFloat)#>]

同样也可以不添加外部参数名,只需要用下划线"_"来表示外部参数名,这样在调用函数时就不需要再把外部参数名写出来。

//根据长宽求几何图形的面积
func area(_ w : Float, height h : Float) -> Float {
    let value : Float = w * h
    return value
}
area(100, height: 200)

但是并不建议这样做,因为它会降低代码的可读性,尤其对OC来说,这会造成极大的阅读困难。比如当你将area函数改成这样时

func area(_ w : Float, _ h : Float) -> Float {
    let value : Float = w * h
    return value
}

在OC中检索area函数是这样的
函数检索是这样子的

在OC中调用area函数是这样的

[swiftVC area:100 :200];

如果参数再多点,估计就真的睁眼瞎了,肯定也会抓狂。另外更值得注意的是,外部参数名和内部参数名不能同时“消失”,否则可能都没法往下继续将代码写下去,甚至影响功能的开发。
比如这样,func area(_ : CGFloat, _ : CGFloat) -> CGFloat首先这是一个没有任何语法错误的函数定义,当然肯定是可以运行的,但是再看看函数体内部实现,你会发现传参不见了,根本就影响到了面积的换算过程,功能写不下去了,因为拿不到相关的参数值,只能return一个心之所想的面积值。

func area(_  : CGFloat, _ :  CGFloat) -> CGFloat {
        return 100
    }

最后还有一种特殊情况,就像上述中实参和形参同名类似,函数的参数可以内外参数同名。所谓同名就如func area(width width : CGFloat, height height : CGFloat) -> CGFloat这样的写法,当然还有一种写法,可能很多都没见过func area(#width : CGFloat, #height : CGFloat) -> CGFloat,遗憾的是这两种写法在最新的Swift中都是错误的写法,用不了!大概可以在swift的标准库里些许能找到点蛛丝马迹。
现在很简单了,只需要开发者写一个名字就行,可以理解为省掉了内部参数名,只编写外部参数名就完事了。

func area(width : CGFloat, height : CGFloat) -> CGFloat {
        return 100
    }

在swift环境下调用函数是这样子的

area(width: 100, height: 200)

在OC环境下调用方法是这样子的

//OC重新做了方法的映射
[swiftVC areaWithWidth:100 height:200];

你可能感兴趣的:(iOS入门小知识-Swift内外参数名)