JHHK

欢迎来到我的个人网站
行者常至 为者常成

2_2、函数

目录

函数的定义

1、函数的定义

//形参默认是let 也只能是let
func sum(num1: Int,num2: Int) -> Int{
    return num1 + num2
    //num1 + num2 //隐式返回
}
//调用时 num1 与 num2 必须得写
print(sum(num1:10,num2:20))

2、无返回值

func sayHello(){
    print("hello")
}
sayHello()

3、返回元组实现多返回值

func calculate(v1:Int,v2:Int)->(sum:Int,dif:Int,aver:Int){
    let sum = v1 + v2
    return (sum,v1-v2,sum>>1)
}
let result = calculate(v1:8,v2:4)
print(result.sum,result.dif,result.aver)

函数的参数

1、参数标签

//定义一个函数
func goToWork(time:String){
    print("this time is \(time)");
}
goToWork(time:"08:00")


//可以修改参数标签
func goToWork1(at time:String){
    print("this time is \(time)");
}
//调用时修改参数标签为at
goToWork1(at:"09:00")


//省略参数标签
func goToWork2(_ time:String){
    print("this time is \(time)");
}
//调用时省略参数标签
goToWork2("10:00")

2、参数的默认值

func check(name:String="nobody",age:Int,job:String="none"){
    print("name=\(name),age=\(age),jon=\(job)")
}
check(name:"xiaoming",age:18)

3、可变参数

func sum24(numbers:Int...)->Int{
    var total = 0
    for number in numbers {
        total+=number
    }
    return total
}
print(sum24(numbers: 10,20,30,40))

//一个函数最多只能有1个可变参数
//紧跟在可变参数后面的参数不能省略参数标签
func test(_ numbers:Int...,string:String,_ other:String){
    print("test")
}
test(10,20,30,40, string: "bob", "other")

print函数的使用

func printUse(){
    print("1",12,"3")
    
    //separator的默认值是 " "
    print("1",12,"3",separator:"-")
    
    //terminator的默认值是 "\n"
    print("1",12,"3",terminator:"\n**\n")
    
    print("1",12,"3",separator: "-",terminator:"**\n")
}

输出结果

1 12 3
1-12-3
1 12 3
**
1-12-3**

输入输出参数

1、inout 使用

//可变参数不能标记为 inout
//inout参数不能有默认值
//inout 的本质是地址传递
func swapValues(num1:inout Int,num2:inout Int){
    let num3 = num1
    num1 = num2
    num2 = num3
    print("num1 =",num1)
}

var num41 = 41
var num42 = 42

swapValues(num1: &num41, num2: &num42)
print(num41,num42)

2、inout参数 只能传入可以被多次赋值的

func swapValues2(num:inout Int){
    num = 90
}
var array = [10,20,30]
swapValues2(num: &array[0])
print(array)

3、实现两个数交换可以使用元组

func swapValues3(num1:inout Int,num2:inout Int){
    (num2,num1) = (num1,num2)
}

var num43 = 43
var num44 = 44
swapValues3(num1: &num43, num2: &num44)
print(num43,num44)

函数重载

函数重载
注意与函数重写的区别

1、函数名相同
参数个数不同||参数类型不同||参数标签不同
构成重载

func sum(_ num1:Int,_ num2:Int)->Int{
    return num1 + num2
}

//返回值类型与函数重载无关
func sum(_ num1:Int,_ num2:Int,_ num3:Int){
        print(num1 + num2 + num3)
}

let result = sum(1,2)
print("result = ",result)
sum(1,2,3);

2、尽量不要写出这种函数重载

func sum(num1:Int,num2:Int){
    print("num1 = ",num1,"num2 = ",num2)
}

func sum(num3:Int,num4:Int){
    print("num3 = ",num3,"num4 = ",num4)
}

sum(num1: 1, num2: 2)
sum(num3: 3, num4: 4)

3、参数默认值可能引起二义性

func sum(_ num1:Int,_ num2:Int){
    print(num1,num2)
}

func sum(_ num1:Int,_ num2:Int,_ num3:Int = 3){
    print(num1,num2,num3,separator:"-")
}

sum(1, 2)

4、可变参数可能引起二义性

func sum(_ num1:Int,_ num2:Int){
    print("num1,num2")
}

func sum(_ numbers:Int...){
    print("可变参数")
}
sum(1, 2)

内联函数

release模式会有内联的优化

1、内联函数示例1

func test6(){
    print("test6")
}
test6();

//编译器会优化为
//print("test6")

2、内联函数示例2

func add6(a:Int,b:Int)->Int{
    return a+b
}
let c = add6(a: 1, b: 2)

//编译器会优化为
//let c = 3

3、@inline

//永远不会被内联(即使开启了编译器优化)
@inline(never) func test63(){
    print("test")
}

//开启编译器优化,即使代码很长,也会被内联(递归调用函数、动态派发的函数除外)
@inline(__always) func test64(){
    print("test")
}

函数类型

1、函数类型

//函数的类型是 (Int,Int)->Int
func sum7(a:Int,b:Int)->Int{
    return a+b
}

let fn:(Int,Int)->Int = sum7
print(fn(2,3))

2、函数类型作为参数

func sum(num1:Int,num2:Int) -> Int{
    return num1 + num2
}

func sub(num1:Int,num2:Int)->Int{
    return num2 - num1
}

func calculate(num1:Int,num2:Int, sumFunc:(Int,Int)->Int,subFunc:(Int,Int)->Int){
    let sumResult = sumFunc(num2,num1)
    print("sumResult = ",sumResult);
    
    let subResult = subFunc(num2,num1)
    print("subResult = ",subResult)
}

calculate(num1: 20, num2: 10, sumFunc: sum, subFunc: sub)

3、函数类型作为返回值

func next7(_ input:Int)->Int{
    input+1
}

func previous7(_ input:Int)->Int{
    input-1
}

//返回值是函数类型的函数 叫做高阶函数
func forward7(_ forward:Bool) -> (Int)->Int{
    forward ? next7:previous7
}

let next = forward7(true)(3)
let previous = forward7(false)(3)
print(next,previous)

typealias

func typealiasUse(){
    /**
     起别名
     */

    typealias Byte = Int8
    typealias Short = Int16
    typealias Long = Int64

    typealias IntFn = (Int,Int)->Int

    //按照swift标准库的定义 Void就是空元祖()
    //public typealias Void = ()
}

嵌套函数

func nestFunctionUse(){
    func forward9(forward:Bool) -> (Int)->Int{
        
        func next(input:Int)->Int{
            input+1
        }
        
        func previous(input:Int)->Int{
            input-1
        }
        
        return forward ? next:previous
    }

    print(forward9(forward: true)(3))
}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.