2.2、函数

2017-06-28  本文已影响10人  艾希_可可

//: Playground - noun: a place where people can play

import UIKit

//函数:用来完成特定任务的代码块

/*

 函数声明: 告诉编译器函数的名字,返回类型及参数

 函数定义: 提供了函数的实体

 func(关键字) 函数名称 (参数名:参数类型,参数名:参数类型..)->函数返回值类型{函数实现部分}

 */

//无参返回值

funcsay(){

    print("hello")

}

say()

//有参数无返回值

funcsayWithName(name:String,age:Int){

    print("say is\(name)")

}

sayWithName(name:"Tom",age:18)

//有参数有返回值类型

funcinfoShow(name:String,age:Int)->String{

    return ("My name is\(name)")

}

letb =infoShow(name:"Tina", age:10)

print(b)

//嵌套函数

funcshowArray(array:[Int]){

    fornuminarray {

        print(num)

    }

    leta = array.count

    ifa>0{

        print("数组有值")

    }

//    func add(a:Int,b:Int)->Int{

//        return a + b

//    }

//    return add(a: 7, b: 8)

}

showArray(array: [2,3,4,5])

//默认情况下的参数都是内部参数,不能外部使用,外部参数只能外部使用,函数内部不能使用

//函数参数

funcjoinStr(s1:String,s2:String,value s3:String="name")->String{

    returns1+s2+s3

}

joinStr(s1:"1", s2:"2")

joinStr(s1:"1", s2:"2", value:"3")

//注意:如果参数有默认值,需要修改需加上外部参数名

//默认情况下,swift中所有参数都是常量参数,如需要修改需修改变量在函数内重新赋值

funcswapValue(a:Int,b:Int){

    vara = a

    varb = b

    print("交换前a =\(a) b =\(b)")

    lettemp = a

    a = b

    b = temp

    print("交换后a =\(a) b =\(b)")

}

swapValue(a:3,b:4)

//如果想在函数中修改外界传入的参数,可以在参数的数据类型添加关键字inout,这时候传递的是参数本身而不是参数的值

varx1 =10

varx2 =20

funcswap3(ax:inoutInt,bx:inoutInt){

    lettemp = ax

    ax = bx

    bx = temp

    print("交换后a =\(x1) b =\(x2)")

}

print("交换前a =\(x1) b =\(x2)")

swap3(ax: &x1, bx: &x2)

/*

 inout 关键字补充 swift有两种参数传递方式

 1、值传递

 值传递是参数的一个副本,这样在调用参数的过程中不会影响原始数据

 2、指针传递

 指针传递把参数本身引用(内存地址)传递过去,在调用的过程会影响原始数据

 说明上面inout是什么传递? 指针传递

 在swift中,只有class是指针传递,其余的比如Int、Float、Bool等都是值传递

 有时候我们需要通过一个函数改变函数外面变量的值(将一个值类型参数以引用方式传递),这时,Swift提供的inout关键字就可以实现

 注意 inout修饰的参数是不能有默认值的,

 一个参数一旦被inout修饰,就不能再用var 或者 let修饰

 */

varvalue =50

funcincrement(value:inoutInt, length:Int) {

    value += length

}

increment(value: &value, length: 20)//系统默认添加了一个&地址符号,说明可以修改原地址数据

print(value)

//如果有多个参数可以使用集合

funcadd(other:Int,nums:Int...)->Int{

    varsum =0

    fornuminnums{

        sum += num

    }

    returnsum

}

add(other:2, nums:1,2,3,4)

//函数实际上是一种特殊的闭包,你可以使用{}来创建一个匿名闭包。使用in将参数和返回值类型声明与闭包函数体进行分离。

varnumbers = [1,3,4,2,5]

numbers.map({

    (number:Int)->Intin

    letresult =3* number

    returnresult

})

//你可以通过参数位置而不是参数名字来引用参数——这个方法在非常短的闭包中非常有用。当一个闭包作为最后一个参数传给一个函数的时候,它可以直接跟在括号后面。

print("特殊闭包==",numbers.map({ numberin3* number }))

//map怎么使用

letmapnumbers = [1,2,3,4]

letresult =mapnumbers.map{ $0 +2}

print(result)  // [3,4,5,6]

//map 方法接受一个闭包作为参数, 然后它会遍历整个 numbers 数组,并对数组中每一个元素执行闭包中定义的操作。 相当于对数组中的所有元素做了一个映射。 比如咱们这个例子里面的闭包是讲所有元素都加 2 。 这样它产生的结果数据就是 [3,4,5,6]

/*

 ------------------------------函数类型:

 类似于C语言的指向函数的指针

 类似于OC语言的block

 函数类型是由函数的参数类型和返回值类型组成的

 */

//可以利用函数类型定义函数变量和常量

funcsum(a:Int,b:Int)->Int{

    returna + b

}

funcsub(a:Int,b:Int,c:Int)->Int{

    returna - b

}

// 这两个函数的类型是 (Int, Int) -> Int

// 函数类型可以作为函数返回值

funcmax(a:Int, b:Int) ->Int

{

    returna > b ? a : b

}

funcsub(a:Int, b:Int) ->Int

{

    returna - b;

}

// 可以利用函数类型定义函数变量和常量

varfuncP:(Int,Int) ->Int=sum

funcP = sub

print(funcP(10,20))

//练习 page130

//1、2 4 //2、为什么下面代码不编译 4没有逗号//3、3

//如果statuscode是个有5个元素的元祖,什么方式去获取到第五个值 1

上一篇下一篇

猜你喜欢

热点阅读