08.Swift函数

//无参数无返回值的函数
func sayHelloWorld(){
    print("hello,世界")
}
() = sayHelloWorld()//虽然函数无返回值,但是其实返回的是一个空的元组,没有任何元素,可以写为()
print("无参无返回值函数调用的结果:")

//声明一个传入固定数量参数 有单一返回值的函数
func greet(person: String,day: String) -> String{//函数名greet,参数有两个,返回String类型的值
    return "Hi \(person),today is \(day)"
}
let str1 = greet(person: "萧瑟", day: "周日")
print("函数1的调用结果:\(str1)")


//参数的标签:默认情况下是参数名作为调用的标签,当然可以在参数名前自定义标签(_表示不用标签,)
func greet(_ person:String,on day:String)->String{
    return "你好 \(person),今天是\(day)"
}
let str2 = greet("小三儿", on: "周六")
print("调用函数的标签写法:\(str2)")


//参数默认值:函数中参数可以给个默认值,调用时如果没有传该参数的值,就会使用默认值
func someFunc(parameterA: Int, parameterB: Int = 33) {
    print("函数参数默认值的调用:\(parameterA)----\(parameterB)")
}
someFunc(parameterA: 2)//2、33
someFunc(parameterA: 3, parameterB: 4)//3、4


//一个函数返回多个值(元组的使用)
func calculateStatistics(scoreArr:[Int]) -> (min:Int, max:Int, sum:Int){
    //传入分数数组,计算出最大值、最小值、总和
    var min = scoreArr[0]
    var max = scoreArr[0]
    var sum = 0
    for score in scoreArr {
        if score > max {
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }
    return (min,max,sum)
}
let statistics = calculateStatistics(scoreArr: [45,59,78,32,43,100,99,91])
print("调用返回多个值得函数结果:最小值:\(statistics.min),最大值:\(statistics.1),总和:\(statistics.sum)")
//如果调用上方函数传入了一个空数组,会报错 ======= 返回可选元组
//let statisticsNil = calculateStatistics(scoreArr: [])
func minMax(array:[Int]) -> (min: Int, max: Int)? { //返回值后面加个?,注意(Int, Int)?表示整个元组是可选的,(Int?, Int?)是元组中的元素值是可选的
    if array.isEmpty {
        return nil
    }
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array {
        if value < currentMin {
            currentMin = value
        }else if value > currentMax{
            currentMax = value
        }
    }
    return (currentMin,currentMax)
}
if let minMaxValue = minMax(array: []){
    print("返回可选元组:\(String(describing: minMaxValue))")
}
if let minMaxValue2 = minMax(array: [3,5,2,7]){
    print("返回可选元组2:\(String(describing: minMaxValue2))")
}


//一个函数传入不固定的参数(以数组形式),返回一个值
func sumOf(numArr: Int...) -> Int{//传入不固定个参数,在参数的类型后加...
    var sum = 0
    for num in numArr {
        sum += num
    }
    return sum //返回所有参数的和
}
let zeroSum = sumOf()
let threeSum = sumOf(numArr: 12,35,41)
print("传入不固定个参数的函数调用结果:\(zeroSum)---\(threeSum)")


//函数的嵌套:重构一个太长或者太复杂的函数(函数先声明 再调用)
func returnFifteen() -> Int{//无参,有返回值
    var y = 10
    func add(){//函数内的一个函数
        y += 5
    }
    add()
    return y
}
let fifteen = returnFifteen()//调用最外层的函数
print("函数嵌套的结果:\(fifteen)")


//函数作为一个函数的返回值
func makeOne() -> ((Int) -> Int){//参数为空,返回值是另一个函数(可以参照另一个函数的传参和返回值来写)
    func addOne(number: Int) -> Int{//参数为Int型,返回值为 Int型
        return 1 + number
    }
    return addOne
}
var oneMake = makeOne()//调用最外层函数,返回的结果oneMake是最外层函数中的返回函数
let oneValue = oneMake(7)//然后在调用最外层函数返回的函数,获取返回函数的返回值(真TM绕)
print("函数作为一个函数的返回值调用:\(oneValue)")


//函数作为一个函数的参数
func lessThanTen(num: Int) -> Bool{//传入一个参数,判断是否小于10 (定义一个作为参数的函数)
    return num < 10
}
func hasAnyMatches(list:[Int], condition:(Int) -> Bool) -> Bool{//一个参数是个数组,另一个参数是一个函数,返回值是Bool型
    for item in list {//遍历参数数组
        if condition(item) {//如果数组中有值小于10 就返回true
            return true
        }
    }
    return false//遍历完成后,没有小于10的值,就返回false
}
let isLessTen = hasAnyMatches(list: [19,17,25,13], condition: lessThanTen)//检查list中是否有小于10的数
print("函数作为一个函数的参数调用结果:\(isLessTen)")


//输入输出参数:在函数中修改函数外的参数变量的值
func swapTwoInts(a: inout Int, inputB b: inout Int){//定义一个输入输出参数时,在参数定义前加inout关键字;输入输出参数不能有默认值,而且可变参数不能用inout标记
    let tempA = a
    a = b
    b = tempA
    //该函数主要功能是交换两个参数的值
}
var someInt = 33
var anotherInt = 95
swapTwoInts(a: &someInt, inputB: &anotherInt)//需要传入变量,而且传入的参数前要加&符号,表示可以被函数修改
print("输入输入参数在函数中被修改了:\(someInt)--\(anotherInt)") //95,33


//函数类型:函数是有类型的,例如:(Int,Int) -> Int; () -> Void 类型等
func addTwoInts(a:Int,b:Int) -> Int {
    return a + b
}
var mathFunction: (Int, Int) -> Int = addTwoInts//定义了一个mathFunction的变量,类型是“一个有两个Int型的参数并返回一个Int型值的函数”,并将这个新的变量指向了 addTwoInts函数
print("函数的类型调用:\(mathFunction(2,3))")//调用函数变量并打印其值
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容