七、函数



func 函数名(形参列表)->(返回值类型){  }



形参类型1,形参名2: 形参类型2,. . .

func math(num: Int, num1: Int, str: String) -> Int { return num + num1 }


 



       2、没有返回值、无参:


三种写法:1)func mathed1(age: Int, name: String) -> Void { } 
 
 
 
                    2)func mathed2() -> () { }              //  无参形式 
 
 
 
                    3)func mathed3(age: Int, name: String) { }


 



一个函数可以返回元组数据



func find(id: Int) -> (name: String, age: Int) {
    if id > 0 {
        return ("jack", 12)
    } else {
        return ("None", 0)
    }
}
var person = find(12)
print("he is name \(person.name), age is \(person.age)")



一般情况,通过形式参数的名字,就能推断出参数的含义和作用



func addStudent(name: String, age: Int, id: Int) {  }         
     addStudent("jack", age: 12, id: 1024)



在函数内部一看参数名就知道参数作用,但是形式参数是用在函数内部的,当调用函数时就看不见形参的名字,有可能导致以后会不太明白每个参数的含义



        定义格式: func 函数名(外部参数名  形式参数名:形参类型)->(返回值类型){  }



func addStudent(name: String, Stu_age age: Int, Stu_age id: Int) {}         

     addStudent("Jack", Stu_age: 12, Stu_age: 20)

⚠️一旦定义了外部参数名,在调用函数时就必须加上外部参数名

简写:使用#能简化外部参数名的定义 (新语法修改了,不再适用Swift 3)

 



可以在定义函数时,给形参指定一个默认值,调用函数时,就可以不用给这个形参传值 - func math(name: String, age: Int = 12) { }  math("jack”)  // age参数有个默认值12,调用函数时可以不传值给age参数



        带有默认参数值的形参,swift会自动给他生成一个跟形参名相同的外部参数名



若要传入age参数值时:math(“jack”, age: 21) 



在带有默认参数值的参数名前加下划线 _,调用函数时就不用写外部函数参数名



func math(name: String, _ age: Int = 12) { }   math("jack", 23)



 



默认情况,函数参数都是常量参数,不能在函数内部修改



func math(let name: String)   // let 可省略



可能需要在函数内部修改参数的值,这时需要定义变量参数



在参数名前加 var 即可:func math( var



func append(var string: String, suffix: String, count: Int) -> String {
    for _ in 0..<count{
        string += suffix
    }
    return string
}



在C语言中,利用指针可以在函数内部修改外部变量的值。在swift中利用输入输出参数,也可以在函数内部修改外部变量的值。



能输入一个值进来,也可以输出一个值到外部



定义:在参数名前面加个inout关键字即可   func math(inout num: Int)   math(&a)



func change(inout num1: Int, inout num2: Int) -> () {
    let temp = num1
    num1 = num2
    num2 = temp
}              // 交换外部变量的两个值
var a = 20; var b = 10
change(&a, num2: &b)   // 传入的参数前面必须加 &

 



如何在不利用第三方变量的前提下交换两个变量的值



num1 = num1 + num2     &     num1 = num1^num2
    num2 = num1 - num2     &     num2 = num1^num2
    num1 = num1 - num2     &     num1 = num1^num2



 



输入输出的参数使用注意



传递实参时,必须在实参前面加上& ;不能传入常量或者字面量(比如10)作为参数值(因为不可改)



输入输出参数不能有默认值;输入输出参数不能是可变参数



let、var 修饰( inout  和  let 、var 不能共存)



            8.4、其他价值:



可以实现函数的多返回值(其实让函数返回元组类型,也能实现返回多个值)



func plusAndMinus(num1: Int, num2: Int) -> (sum: Int, min: Int) {
    return (num1 + num2, num1 - num2)
}
var  result = plusAndMinus(22, num2: 14)
result.sum   //  36
 
result.min   //  8



 



func plusAndMinus(num1: Int, num2: Int,inout sum: Int, inout min: Int) -> () {
    sum = num1 + num2
    min = num1 - num2
}
var sums = 0; var mins = 0
plusAndMinus(12, num2: 6, sum: &sums, min: &mins )
sums   // 18
mins   // 6