1. swift 中函数是第上类型,所以函数也可以作为参数和返回结果
2. 定义形式 关键字 名字 (参数列表)-> 返回值类型。下面是一个返回元组的例子。
func addNumber(a:Int,b:Int) -> (addResult : Int, timesResult : Int) { return(a+b, a*b) } let result = addNumber(1, 2) println(result.addResult)
传入两个参数 a,b 并把他们相加,相乘的结果以一个元组的形式指返回。可以没有参数,但是必须有代表参数的(),当没有返回值时,->到 { 前的都要省略。这里的没有返回值是指我们没有定义返回值,但是函数实际上会返回一个void值。它其实是一个空的元组,没有任何的元素,可以写成()
3. 函数的参数名称 :
就如我们上面所看到的函数形式,参数名称 a ,b 只是一个局部的变量,我们只能在自己定义的函 数内使用,不能在外部使用。
假设一个函数有多个参数,我们在使用时可能不知道这些参数的明确意思。这时我们可以使用外部参数名称来解决这个问题。
现在有一个函数要求传入三个函数,父母的身高以及来代码男女的1和2 来求子女的身高。如下:
func getPersonHeight(height1:Float,hieght2:Float,isBoy:Int) -> Float{ if isBoy == 1 { return 45.99 + 0.78 * (height1+hieght2) / 2 + 5.29 } else { return 37.85+0.75 * (height1+hieght2) / 2 + 5.29 } }
当我们在别处使用的时候不会提示这三个数所表示的意思,可能会造成传值的错误。现在我们只需要使用参数的外部名称,在调用时也能明确的标明它们的所代表的意思。 参数的外部名称加在局部名称前面,用空格割开。
func getPersonHeight(height1:Float,hieght2:Float,isBoy:Int) -> Float{ if isBoy == 1 { return 45.99 + 0.78 * (height1+hieght2) / 2 + 5.29 } else { return 37.85+0.75 * (height1+hieght2) / 2 + 5.29 } }
当调用没有外部名称时的代码
let height = getPersonHeight(
170, 180,1);
当调用有外部名称时的代码
let height = getPersonHeight(motehrHeight:
170, fatherHeight: 180, oneIsBoy:1);
有外部名称是更加清晰。而且我们可以简写外部参数名。假如我们已经定义了如下函数
func getPersonHeight(motherHeight:Float, fatherHieght:Float, oneIsBoy:Int) ->
Float
我们的局部函数名已经相当明确了,这时我们只需要在其前面加上 # ,就可以当作外部参数名来使用
func getPersonHeight( # motherHeight:Float, # fatherHieght:Float, # oneIsBoy:Int) -> Float{ if oneIsBoy == 1 { return 45.99 + 0.78 * (motherHeight+fatherHieght) / 2 + 5.29 } else { return 37.85+0.75 * (motherHeight+fatherHieght) / 2 + 5.29 } } let height = getPersonHeight(motherHeight: 170, fatherHieght: 190, oneIsBoy: 1) println(height)
4. 默认参数: 对于一些非必须赋值的参数我们在写参数时可以给其一个默认的值。下面的代码给性别默认为1
func getPersonHeight(motherHeight:Float,fatherHieght:Float, oneIsBoy:Int = 1) -> Float{ if oneIsBoy == 1 { return 45.99 + 0.78 * (motherHeight+fatherHieght) / 2 + 5.29 } else { return 37.85+0.75 * (motherHeight+fatherHieght) / 2 + 5.29 } }
当我们调用的时候会发现,系统会给有默认值的参数加一个外部名称 :
let height =
getPersonHeight(170,
180, oneIsBoy: 2)
不给参数赋值时: let
height = getPersonHeight(170,
180)
注意: 默认参数必须放在所有参数的最右边,否则会造成调用混乱。
5.可变参数 : 在对数类型后面加 ... 直接看代码 ,求 N 个整数的和
func sumOfSomeNumbers(numbers:Int...) -> Int { var sum: Int = 0 for item in numbers { sum += item } return sum } println(sumOfSomeNumbers(1,2,3,4,5))
注意:可变参数必须放在最右面,当同时默认参数也存在时,可变参数放在最后。
6.输入输出参数:
swif 中参数的传递是值传递,函数内部对参数的修改只发生在函数内部,函数的外边参数是不会发生改变的。如果想要改变传入的参数,我们就需要输入输出参数了,这样的参数在函数内部的改这会保持到函数的外部。 输入输出只需要在 参数名称前加上inout。
func inoutTest(var number: Int) { number -= 1; } var number = 3; inoutTest(number) println(number)
输出的值 为 3
下面使用 输入输出函数,输入输出参数调用时要在参数前面加上 &
func inoutTest(inout number: Int) { number -= 1; } var number = 3; inoutTest(&number) println(number)
输出的值 为 2
注意: 输入输出参数不能有默认值,而且可变参数不能用 inout
标记。如果你用 inout
标记一个参数,这个参数不能被 var
或者 let
标记。
7.函数的类型
在swift 中函数属于第一类型,所以有自己的类型,函数的类型由参数的类型跟返回值的类型决定。
func addTwoInts(a: Int, b: Int) -> Int { return a + b }
- 这个函数的类型是 (Int,Int) -> (Int) .我们就可以定义一下这个类型的变量
var addIntsFunc : (Int,Int) -> (Int) = addTwoInts
2. 函数当作参数传递,这时函数的类型显得特别有用。
func addTwoNumber(addFunction:(Int,Int)->(Int), number1:Int, number2:Int) ->Int { return addFunction(number1,number2) } func addTwoInt(number1:Int, number2:Int) -> Int { return number2 + number1; } <pre name="code" class="plain"> func addTwoInt(number1: Int,number2: Int) -> Int { return number1 + number2; } func timesTwoInt(number1: Int,number2: Int) -> Int { return number1 * number2 } func chooseStepFunction(isAdd: Bool) -> (Int,Int) -> Int { return isAdd ? addTwoInt: timesTwoInt; } let function:(Int,Int)->(Int) = chooseStepFunction(false) println(function(1,2))
println(addTwoNumber(addTwoInt, 1,2));
我们声明了一个 addTwoNumber的函数,他的参数是一个(Int,Int) ->(Int) 类型的函数 和两个Int 类型的数。,然后定义了一个(Int,Int) ->(Int) 类型的函数 addTwoInt函数然后当作参数使用。
3. 函数当作返回值.我们现在定义一个函数,以一个bool 值作为参数,然后返回一个(Int,Int) ->(Int)的函数。代码
func addTwoInt(number1: Int,number2: Int) -> Int { return number1 + number2; } func timesTwoInt(number1: Int,number2: Int) -> Int { return number1 * number2 } func chooseCaculateFunction(isAdd: Bool) -> (Int,Int) -> Int { return isAdd ? addTwoInt: timesTwoInt; } let function:(Int,Int)->(Int) = chooseCaculateFunction(false) println(function(1,2))
chooseCaculateFunction 返回了一个 函数 ,根据bool 值决定返回addTwoInt 或 timesTwoInt 函数,然后赋予常量function。调用该常量返回一个Int值并输出。
5.