Swift函数

前端之家收集整理的这篇文章主要介绍了Swift函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前言

Swift统一的函数语法足够灵活,可以用来表示任何函数包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的Objective-C风格函数。参数可以提供默认值,以简化函数调用。参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值可以被修改

在 Swift 中,每个函数都有一种类型,包括函数的参数值类型和返回值类型。你可以把函数类型当做任何其他普通变量类型一样处理,这样就可以更简单地把函数当做别的函数的参数,也可以从其他函数中返回函数函数的定义可以写在在其他函数定义中,这样可以在嵌套函数范围内实现功能封装。

注明:Swift版本为2.1
测试环境:xcode 7.2

函数定义与调用(Defining and Calling Functions)

函数定义语法为:func 函数名(参数列表) ->返回值:

  1. // 函数定义方式:func 函数名称(arg...) ->ReturnValue
  2. func testFunc() ->Void {
  3. // 无参数,无返回值
  4. }

若无返回值,可以直接省略 ->Void

  1. func testArgFunc(arg: Int) {
  2. // 无返回值可以使用Void,其实是空元组
  3. }


我们先来看看官方定义的Void是什么:

  1. /// The empty tuple type.
  2. ///
  3. /// This is the default return type of functions for which no explicit
  4. /// return type is specified.
  5. publictypealiasVoid=()


它其实就是一个空元组。它是作为函数显示指定返回类型时的默认返回值类型。

参数列表可以使用可变参数:

  1. // 可变参数
  2. funccalSum(array: Int...)->Int{
  3. varsum=0
  4. foriteminarray{
  5. sum+=item
  6. }
  7. returnsum
  8. }


函数调用就是通过我们的函数名称调用

  1. calSum(1,2,3)// 6
  2. calSum(1,2)// 3


swift支持函数重载:

  1. // 函数重载
  2. funccalSum(array:[Int])->Int{
  3. varsum=0
  4. foriteminarray{
  5. sum+=item
  6. }
  7. returnsum
  8. }
  9. // 调用方式与上面一样,只是参数类型不一样
  10. calSum([1,3])// 6
  11. calSum([1,4,5])// 10


函数有多个参数时,使用逗号分开,像:(arg1: Int,arg2,Int,arg3: Int)

  1. funcmultipleFunc(arg1: Int,_ arg2: Int)->Int{
  2. return0
  3. }

多重返回值函数(Functions with Multiple Return Values)

函数有多个返回值时,我们可以使用元组作为返回值,当然也可以使用数组、字典等,但是使用元组更简单,更明确:

  1. funcminMax(array:[Int])->(min: Int,max: Int){
  2. varcurrentMin=array[0]
  3. varcurrentMax=array[0]
  4. forvalueinarray[1..<array.count]{
  5. ifvalue<currentMin{
  6. currentMin=value
  7. }elseifvalue>currentMax{
  8. currentMax=value
  9. }
  10. }
  11. return(currentMin,currentMax)
  12. }


Optional返回值类型

函数不一定有返回值时,可以返回可选类型,在类型后面添加个问号即可:

  1. funcminMax(array:[Int])->(min: Int,max: Int)?{
  2. ifarray.isEmpty{returnnil}
  3. varcurrentMin=array[0]
  4. varcurrentMax=array[0]
  5. forvalueinarray[1..<array.count]{
  6. ifvalue<currentMin{
  7. currentMin=value
  8. }elseifvalue>currentMax{
  9. currentMax=value
  10. }
  11. }
  12. return(currentMin,currentMax)
  13. }
  14. // 调用的时候,通过值绑定来判断是否有值
  15. ifletbounds=minMax([8,-6,109,3,71]){
  16. print("min is \(bounds.min) and max is \(bounds.max)")
  17. }
  18. // prints "min is -6 and max is 109"


指定外部参数名(Specifying External Parameter Names)

我们看看Dictonary的一个API:

  1. publicmutatingfuncremoveAll(keepCapacitykeepCapacity: Bool=default)

我们可以看到这里一个参数有两个名字:keepCapacity,其中第一个叫外部参数名,第二个叫函数内部变量。

比如,with是外部参数名,用于在调用显示的;而userId是函数内部变量名,用于内部使用:

  1. funcfind(with userId: Int)->User?{
  2. }
  3. ifletuser=find(with:10){
  4. // find
  5. }

默认参数值(Default Parameter Values)

默认参数要放在参数列表最后:

  1. funcsomeFunction(parameterWithDefault: Int=12){
  2. // function body goes here
  3. // if no arguments are passed to the function call,// value of parameterWithDefault is 12
  4. }
  5. someFunction(6)// parameterWithDefault is 6
  6. someFunction()// parameterWithDefault is 12


可变参数(Variadic Parameters)

可变参数可以接收多个参数:

  1. // 可变参数
  2. // 可变参数接受0个或者多个指定类型的值。可变参数使用...表示
  3. // 函数最多只能有一个可变参数,并且如果有可变参数,这个可变参数必须出现在参数列表的最后
  4. // 如果参数列表中有一或多个参数提供默认值,且有可变参数,那么可变参数也要放到所有最后一个
  5. // 提供默认值的参数之后(先是默认值参数,才能到可变参数)
  6. funcarithmeticMean(numbers: Double...)->Double{
  7. vartotal=0.0
  8. fornumberinnumbers{
  9. total+=number
  10. }
  11. returntotal/Double(numbers.count)
  12. }
  13. arithmeticMean(1,45)// return 3.0
  14. arithmeticMean(1,3)// return 2.0


常量参数和变量参数(Constant and Variable Parameters)

函数参数默认是常量。试图在函数体中更改参数值将会导致编译错误。这意味着你不能错误地更改参数值。

如果要在函数内部修改参数值,那么需要手动声明为变量类型:

  1. // 常量和变量参数
  2. // 在函数参数列表中,如果没有指定参数是常量还是变量,那么默认是let,即常量
  3. // 这里Str需要在函数体内修改,所以需要指定为变量类型,即用关键字var
  4. funcalignRight(var str: String,count: Int,pad: Character)->String{
  5. letamountToPad=count-countElements(str)
  6. // 使用_表示忽略,因为这里没有使用到
  7. for_in1...amountToPad{
  8. str=pad+str
  9. }
  10. returnstr
  11. }


@H_403_188@ 输入输出参数(In-Out Parameters)
  1. // 输入/输出参数
  2. // 有时候,在函数体内修改了参数的值,如何能直接修改原始实参呢?就是使用In-Out参数
  3. // 使用inout关键字声明的变量就是了
  4. // 下面这种写法,是不是很像C++中的传引用?
  5. funcswap(inout lhs: Int,inout rhs: Int){
  6. lettmp=lhs
  7. lhs=rhs
  8. rhs=tmp
  9. }
  10. // 如何调用呢?调用调用,对应的实参前面需要添加&这个符号
  11. // 因为需要修改,所以一定是var类型的
  12. varfirst=3
  13. varsecond=4
  14. // 这种方式会修改实参的值
  15. swap(&first,&second)// first = 4,second = 3


函数类型(Function Types)

  1. // 使用函数类型
  2. // 这里是返回Int类型
  3. // 函数类型是:(Int,Int) -> Int
  4. funcaddTwoInts(first: Int,second: Int)->Int{
  5. returnfirst+second
  6. }
  7. // 函数类型是:(Int,Int) -> Int
  8. funcmultiplyTwoInts(first: Int,second: Int)->Int{
  9. returnfirst*second
  10. }

使用函数类型(Using Function Types)

函数类型也需要类型,也可以用于定义变量,只是它是函数指针类型变量:

  1. varmathFunction:(Int,Int)->Int=addTwoInts
  2. mathFunction(1,2)// return 3
  3. mathFunction=multiplyTwoInts
  4. mathFunction(1,2)// return 2


函数类型作为参数类型(Function Types as Parameter Types)

函数类型也是类型,也可以作为函数的形参:

  1. // 函数类型可以作为参数
  2. funcprintMathResult(mathFunction:(Int,Int)->Int,first: Int,second: Int){
  3. println("Result:\(mathFunction(first,second))")
  4. }
  5. printMathResult(addTwoInts,5)// prints "Result: 8"
  6. printMathResult(multiplyTwoInts,5)// prints "Result: 15"


函数类型作为返回类型(Function Types as Return Types)

函数类型也可以作为返回值类型:

  1. // 函数作为返回类型
  2. funcstepForward(input: Int)->Int{
  3. returninput+1
  4. }
  5. funcstepBackward(intput: Int)->Int{
  6. returninput-1
  7. }
  8. funcchooseStepFunction(backwards: Bool)->((Int)->Int){
  9. returnbackwards? stepBackward : stepForward
  10. }
  11. varcurrentValue=3
  12. letmoveNearerToZero=chooseStepFunction(currentValue>0)// call stepBackward() function
  13. // 参数可以嵌套定义,在C、OC中是不可以嵌套的哦
  14. funcchooseStepFunction(backwards: Bool)->((Int)->Int){
  15. funcstepForward(input: Int)->Int{
  16. returninput+1
  17. }
  18. funcstepBackward(input: Int)->Int{
  19. returninput+1
  20. }
  21. returnbackwards?stepBackward: stepForward
  22. }


嵌套函数(Nested Functions)

在Ojbective-C中,函数是不能嵌套定义的,但是在swift中是可以嵌套的:

  1. funcchooseStepFunction(backwards: Bool)->(Int)->Int{
  2. funcstepForward(input: Int)->Int{returninput+1}
  3. funcstepBackward(input: Int)->Int{returninput-1}
  4. returnbackwards? stepBackward : stepForward
  5. }
  6. varcurrentValue=-4
  7. letmoveNearerToZero=chooseStepFunction(currentValue>0)
  8. // moveNearerToZero now refers to the nested stepForward() function
  9. whilecurrentValue!=0{
  10. print("\(currentValue)... ")
  11. currentValue=moveNearerToZero(currentValue)
  12. }
  13. print("zero!")
  14. // -4...
  15. // -3...
  16. // -2...
  17. // -1...
  18. // zero!

猜你在找的Swift相关文章