您的位置:首页 >> APPLE >> 和屌丝一起学SWIFT-函数
和屌丝一起学SWIFT-函数
[ 孤狼 | 2015-12-08 13:42:55 | APPLE ]

声  明

       本教程仅用于初学SWIFT同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用SWIFT版本为2.0。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。PAEA.CN版权所有。


        Hello,欢迎回到和屌丝一起学SWIFT系列教程中来,上节我们说了控制流,大家有没有习惯if和else啊?其实控制流很简单,直接当做判断条件来理解还是很容易的嘛.好了,废话不多说,这节我们要来一起说说函数,这个可是很重要的东西哦.

 

 

 

[函数]

函数就是一个可以重复利用且具有特定功能的代码段,当我们需要使用的时候直接去调用即可而不用重复去写大段的代码,是一种代码精简的方式之一.同时他也是一个很重要的功能.

 

[定义一个函数]

定义一个函数可以使用固定的定义方法 func 函数名(参数){函数体} 其中参数不是必须的,函数体必须保证正确.

调用一个函数使用他的函数名加上()即可.

func a(){
    print("这就是a函数");
}
a();

输出"这就是a函数"

上面就是个最简单的输出函数了,每次调用a()都会执行内部的输出.

 


 

[参数]

那怎么给一个函数传参呢?SWIFT的函数传参严格限制类型.使用 变量:类型 的格式传参,多个参数之间用,分隔,在调用需要传参的函数时,直接在()里对应的位置放上参数即可.

func a(i:String){
    print("传入的是:\(i)");
}
a("你好");

输出"传入的是:你好"

 

var a=10;
var b=20;
var c=30;
func f(num1:Int,num2:Int,num3:Int){
    print(num1);
    print(num2);
    print(num3);
}
f(a,num2: b,num3: c);

输出:10 20 30

我们看到,在调用多个参数的函数时,除了第一个,其他的都要标注你这个参数是传给谁的.

 

TIP:在多参数传递的使用上,SWIFT必须标记出传参对象确实是多此一举了.不过,一定程度上保证了参数传递的安全性,不至于让你传错.

 

可变参数的使用也是一大特色.

可变参数就是不固定我的参数,传几个用几个.通过在参数定义的数据类型之后加上 ... 来实现

func f(num:Int...){
    for(var i=0;i<num.count;i++){
        print(num[i]);
    }
}
f(3,2,3,4,5,5);

输出:3,2,3,4,5,5.

 

func f(a:Int){
    a++;        //报错
    print(a);
}
f(4);

TIP:SWIFT中参数的格式默认是常量,这点不同于其他语言,所以,如果你再函数体内修改参数的值,则会报错.

 

既然默认是常量参数,那么我们能不能定义变量参数呢?答案是可以的,只要在参数前加上 var 即可

func f(var a:Int,var b:Int){
    a++;
    b++;
    print(a+b);
}
f(1,b:3);

输出:6

 

不论是常量参数还是变量参数,最后我们都没有办法把函数里面的值直接传出来,在SWIFT里,还有一种参数,输入输出参数,可以直接把函数体内部的参数带出来.

定义一个输入输出参数,使用 inout 关键字来定义一个参数即可,并且,只能传递变量,因为常量无法更改哦.

在调用输入输出参数的时候,需要在参数前加&号,来表示这个参数允许函数体更改.

var b: Int=10;
func f(inout a:Int){
    a++;
}
f(&b);
print(b);

输出:11

 


 

[返回值]

我们还可以接收函数的返回值.想要接收返回值,那么就要先定义函数的返回值类型,在()后使用 ->类型 的方式来定义一个函数的返回值类型

func c2(i:Int)->Int{
    var num=i*2;
    return num;
}
var a=c2(4);
print(a);

输出:8

func f(i:Int)->(num1:Int,num2:Int){
    let num1=i*2;
    let num2=i*3;
    return (num1,num2);
}
var a=f(4);
print(a);

输出:(8, 12)

 

TIP:在上面的函数体中,var num=i*2;这句会收到系统的提示警告(非错误),提示内容为"Variable 'num' was never mutated;consider changing to 'let' constant".意思是"如果你的这个变量是不会改变值的,请尽量使用let来定义一个常量,方便SWIFT对其进行优化."如果你一定需要一个变量,那么就忽略它,如果可以改为常量,那就改成常量.

 

我们还要注意的就是变量类型,在接收返回值的时候不要弄错类型.

func f()->Int{
    return 2;
}
var a:String=f(); //报错

这里我们用一个string类型的变量去接收一个int类型的返回值,就会报错.

 


 

[局部变量和全局变量]

另外要分清局部变量及全局变量的关系.顾名思义,局部变量就是只在局部有效的变量,全局变量就是全局都有效的变量.

func f(){
    var a=123;
    let b=222;
}
f();
print(a);   //报错
print(b);   //报错

上面式子会报错的原因就是a和b都是函数体内部定义的局部变量,他们仅在函数体内部有效,出了函数体就无效了.系统找不到他们,所以无法输出.

 

 


[函数类型]

每个函数都有种特定的函数类型,由函数的参数类型和返回类型组成。

func f(a:Int)->Int{
    var num=a;
    return num++;
}

上面的函数,他的函数类型就是 (Int)->Int 类型

 

 

[使用函数类型](函数变量,函数常量)

既然有函数类型,那么我们就要去使用他.在SWIFT中,函数类型是可以定义为一个常量或者变量来是使用的.这里要注意的是,定义的函数变量类型要和赋值给他的函数一致,不然无法赋值.比如我们定义一个(Int)->Int类型的函数变量,那么就必须赋值一个(Int)->Int类型的函数哦.

func f(a:Int)->Int{
    var num=a;
    return ++num;
}
var f2:(Int)->Int=f;
var num=f2(0);
print(num);

输出1

 

其实大家可以看出来,这个不就是复制函数嘛.等于给这个函数起了个别名嘛!

其实不是啦,这里说到的使用其实是把f2当成变量来使用的,f2的值就是f函数,换句话说,f2不是f的复制体,f是函数,而f2是变量,我们也可以给f2换值的哦.看下面的例子就更好理解了.

func x(a:Int)->Int{
    var num=a;
    return ++num;
}
func y(a:Int)->Int{
    var num=a;
    return --num;
}
//我们有2个函数,一个自增,一个自减,我们来定义一个函数变量.并把x函数赋值给他.
var f:(Int)->Int=x;
//第一次调用
var num1=f(5);
//现在我们给f的值替换成y函数.这里因为2个函数都是相同格式,所以直接按变量赋值的样式直接赋值即可哦.
f=y;
//第二次调用
var num2=f(5);
print(num1);    //输出:6
print(num2);    //输出:4

好了,这段要好好理解一下哦.

 

TIP:我们既可以使用已知的函数类型来创建函数变量,或函数常量,也可以让SWIFT来自己猜.


func f(var a:Int)->Int{
    return ++a;
}
var f2=f;
print("\(f2(9))");

输出:10

 

 

[函数类型作为参数类型]

既然函数类型可以用来创建变量或常量,他也可以当做参数来使用.一起来看看吧.

func x(a:Int)->Int{
    var num=a;
    return ++num;
}
func f2(f:(Int)->Int,b:Int){
    print("\(f(b))");
}
f2(x,b:10);

输出11.

虽然可以单做参数来使用,不过孤狼这里并没有发现使用这种方法的好处,因为如果想调用一个函数,为何不直接调用,还要传参.暂且知道有这么回事吧.

 

[函数类型作为返回类型]

既然变量,常量,参数都能扮演,他当然可以扮演返回类型啦.

func x(a:Int)->Int{
    var num=a;
    return ++num;
}
func y(a:Int)->Int{
    var num=a;
    return --num;
}
func c(a:Bool)->(Int)->Int{
    return a ? x : y;
}
var caozuo=c(true); //获取自增函数
print("\(caozuo(5))");  //输出:6
caozuo=c(false);    //获取自减函数
print("\(caozuo(5))");  //输出:4

好了,其实也是挺绕的,不过毕竟是个新功能,我们可以根据值来自动选择使用的函数.

 

 


[嵌套函数]

顾名思义,就是相互嵌套呗.

func a(var _a:Int)->Int{
    return ++_a;
}
func sum(b:Int)->Int{
    var num1=a(b);
    //调用a函数,num1=6
    var num2=b;
    return num1+num2;
}
var re=sum(5);
print(re);

输出:11


好了,今天就到这里吧.下节见.



本节代码下载

 


转载请注明出处:http://gl.paea.cn/apple/content/2015/12/08/85.html