2021-08-15

iOS  swift  函数

1 函数的定义

func pi() ->Double{

  return 3.14 

}

func sum(v1: Int,v2:Int) ->Int {

 return v1 + v2

}

sum(v1:10,v2:20)

无返回值

func sayHello () -> Void{

  print("Hello")

}

func sayHello () -> (){

  print("Hello")

}

func sayHello () {

  print("Hello")

}

2 隐式返回

如果整个函数体是一个单一的表达式,那么函数会隐式返回这个表达式。

func sum(v1:Int,v2:Int) -> Int {

     v1 +v2

}

sum(v1:10 ,v2:20)

返回元组:实现多返回值

func calculate(v1:Int,v2:Int) -> (sum: Int, difference:Int, average: Int){

let sum = v1 + v2

return (sum, v1-v2,sum >>1)

}

let result  = Calulate(v1:20,v2:10)

result.sum 

result.difference 

result.averge 

3  函数的文档注释

func  sum(v1:Int,v2:Int) -> Int {

v1 + v2 

}

4 参数标签 (Argument Lable)

可以修改参数标签

func goToWork(at time:String){

print("this is \(time)")

}

goToWork(at:"08:00")

可以使用下划线_  省略参数标签

func sum(_v1: Int,_v2:Int) -> Int {

        v1+v2

}

sum(10,20)

5 默认参数值(Default Parameter Value)

参数可以有默认值 

func check(name:String = "nobody",age:Int, job: String = "none"){

print(“name = \(name)”,age=\(age),job=\(job)")

}

C++的默认参数值有个限制:必须从右往左设置。由于swift拥有参数标签,因此并没有此类限制。

但是在省略参数标签时,需要特别注意,避免出错。

//这里的middle不可以省略参数标签

func test(_ first: Int = 10,middle:Int ,_ last: Int = 30){

}

test(middle:20)

6 可变参数(Variadic  Parameter)

func  sum(_ numbers: Int)-> Int{

  var  total  = 0 

  for number in numbers {

       total += number

 }

return  total 

}

sum(10,20,30,40)

一个函数最多只能有1个可变参数。

swift 自带的print 函数

print(1,2,3,4,5)

7 输入输出参数(In-Out Parameter)

可以用inout定义一个输入输出参数: 可以在函数内部修改外部实参的值。 

func   swapValues(_ v1:inout Int,_v2:inout Int){

    let tmp = v1

     v1=v2

     v2= tmp

}

 var  num1 = 10

 var  num2 = 20

swapValues(&10,&20)

func  swapValues(_v1:  inout Int, _v2: inout Int){

     (v1,v2)  = (v2,v1)

}

   (1) 可变参数不能标记inout

(2)inout参数不能有默认值

(3)inout 参数只能传入可以被多次赋值

(4)inout 参数的本质是地址传递 (引用传递)

8 函数重载  (function Overload)

规则: 

函数名相同

1 参数个数不同//2 参数类型不同//3 参数标签不同

1 func sum(v1: Int,v2:Int) -> Int {

        v1+ v2

}

2 func sum (v1:Int,v2: Int,v3:Int) -> Int {

        v1+v2+v3

}//参数个数不同

func sum(v1:Int,v2:Double) -> Double {

        Double (v1) +v2

}//参数类型不同

func sum(_v1:Int ,_v2:Int)-> Int {

       v1 + v2

}//参数标签不同

9 函数重载注意点

(1)返回值类型与函数重载无关

func sum(v1:Int,v2:Int)-> Int{v1 + v2}

func sum(v1:Int, v2:Int){}

(2) 默认参数值和函数重载一起使用产生二义性时,编译器并不会报错(在C++中会报错)

func sum(v1:Int ,v2:Int) ->Int{

       v1 + v2

}

func sum(v1:Int ,v2:Int,v3:Int = 10) ->Int{

       v1 + v2 + v3

}

sum(v1:10,v2:20)

可变参数 省略参数标签 函数重载一起使用产生二义性时,编译器有可能会报错。

func sum(v1: Int , v2: Int) -> Int{} 

func sum(_ v1:Int ,_ v2:Int) ->Int{

       v1 + v2

}

func sum(_ numbers: Int...) -> Int{

   var  total = 0

for number in numbers{

total += number 

}

return total }

sum(10,20)

10 内联函数 (Inline function)

如果开启了编译器优化(release模式默认会开启优化),编译器会自动将某些函数变为内联函数。

将函数调用展开成函数体。

BuildSetting -> optimization -> Optimize for Speed[-O]

拿些函数不会被自动内联。

函数体比较长/包含递归调用/包含动态派发

11 @inline

在release模式下,编译器已经开启优化,会自动决定哪些函数需要内联,因此没有必要使用@inline

12 函数类型 (Function Type)

每一个函数都是有类型的,函数类型由形式参数类型,返回值类型。

函数类型作为函数返回值

   返回值时函数类型的函数,叫做高阶函数


13  typealias(别名)

 typealias用来为已经存在的类型重新定义名字的,通过命名,可以使代码变得更加清晰.使用的语法也很简单。

14 嵌套函数 

将函数定义在函数内部。

代码:

func  forward(_ forward:Bool)-> (Int) -> Int{

     func  next (_ input:Int ) ->Int{

        input +1

}

   func previous(_ input:Int) ->Int {

       input -1

}

return forward ? next : previous 

}

forward(true)(3)//4

forward(false)(3)//2

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容