美文网首页
Swift函数_6

Swift函数_6

作者: edison0428 | 来源:发表于2017-11-20 10:36 被阅读5次

    函数是一段完成特定任务的独立代码片段。你可以通过给函数命名来标识某个函数的功能,这个名字可以被用来在需要的时候"调用"这个函数来完成它的任务。

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

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

    函数的定义与调用
    //带参数,带返回值
    func sum(x : Int, y : Int) -> Int {
        
        return (x + y)
    }
    
    print(sum(x: 10, y: 10))
    
    
    //带参数,带返回值 元组
    func maxAndMin(dataArr : [Int]) -> (maxInt:Int,minInt:Int) {
        
        var currentMin = dataArr[0]
        var currentMax = dataArr[0]
        for value in dataArr[1..<dataArr.count] {
            if value < currentMin {
                currentMin = value
            } else if value > currentMax {
                currentMax = value
            }
        }
        return (currentMin, currentMax)
        
    }
    
    print(maxAndMin(dataArr: [5,7,3,4,9,7,1,6]))
    
    
    //可选返回类型
    
    func max(dataArr : [Int]) -> Int? {
        
        var currentMin = dataArr[0]
        for value in dataArr[1..<dataArr.count] {
            if value < currentMin {
                currentMin = value
            }
        }
        return currentMin
        
    }
    
    
    if let min = max(dataArr: [5,7,3,4,9,7,2,6]){
        
        print(min)
    }else{
        print("没有返回有效值")
    }
    
    
    //可选返回类型 元组
    
    func maxAndMinOption(dataArr : [Int]) -> (maxInt:Int,minInt:Int)? {
        
        
        var currentMin = dataArr[0]
        var currentMax = dataArr[0]
        for value in dataArr[1..<dataArr.count] {
            if value < currentMin {
                currentMin = value
            } else if value > currentMax {
                currentMax = value
            }
        }
        return (currentMin, currentMax)
        
    }
    
    let dataA:[Int] = [5,7,3,4,9,7,2,6]
    
    if let (maxInt,minInt) = maxAndMinOption(dataArr: dataA){
        
        print(maxInt,minInt)
    }else{
        print("没有返回有效值")
    }
    
    函数的参数标签和参数名称

    每个函数参数都有一个参数标签( argument label )以及一个参数名称( parameter name )。参数标签在调用函数的时候使用;调用的时候需要将函数的参数标签写在对应的参数前面。参数名称在函数的实现中使用。默认情况下,函数参数使用参数名称来作为它们的参数标签

    /函数的参数标签和参数名称
    
    //默认情况下,函数参数使用参数名称来作为它们的参数标签
    func getString(inputStr:String) -> String  {
        
        return "hello" + inputStr
    }
    
    print(getString(inputStr: "Edison"))
    
    //指定参数标签
    func getName(youEnglishName name: String) -> String {
        
        return name + "hello"
    }
    print(getName(youEnglishName: "Edison"))
    
    
    //忽略参数标签
    func getAgeDes(_ age : Int) -> String {
        
        
        return "your age is" + String(age)
    }
    
    print(getAgeDes(14))
    
    
    默认参数值

    你可以在函数体中通过给参数赋值来为任意一个参数定义默认值(Deafult Value)。当默认值被定义后,调用这个函数时可以忽略这个参数

    func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
        // 如果你在调用时候不传第二个参数,parameterWithDefault 会值为 12 传入到函数体中。
    }
    someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault = 6
    someFunction(parameterWithoutDefault: 4) // parameterWithDefault = 12
    
    

    将不带有默认值的参数放在函数参数列表的最前。一般来说,没有默认值的参数更加的重要,将不带默认值的参数放在最前保证在函数调用时,非默认参数的顺序是一致的,同时也使得相同的函数在不同情况下调用时显得更为清晰

    可变参数

    一个可变参数(variadic parameter)可以接受零个或多个值。函数调用时,你可以用可变参数来指定函数参数可以被传入不确定数量的输入值。通过在变量类型名后面加入(...)的方式来定义可变参数。

    可变参数的传入值在函数体中变为此类型的一个数组。例如,一个叫做numbersDouble... 型可变参数,在函数体内可以当做一个叫numbers[Double] 型的数组常量

    
    func avg(dataAll: Double...) -> Double {
        
        var total : Double = 0
        for num in dataAll {
            total += num
        }
        return total/Double(dataAll.count)
    }
    print(avg(dataAll: 1,2,3,4,5,6,7,8,9))
    
    
    
    输入输出参数

    函数参数默认是常量。试图在函数体中更改参数值将会导致编译错误(compile-time error)。这意味着你不能错误地更改参数值。如果你想要一个函数可以修改参数的值,并且想要在这些修改在函数调用结束后仍然存在,那么就应该把这个参数定义为输入输出参数(In-Out Parameters)

    定义一个输入输出参数时,在参数定义前加 inout 关键字。一个输入输出参数有传入函数的值,这个值被函数修改,然后被传出函数,替换原来的值。想获取更多的关于输入输出参数的细节和相关的编译器优化,请查看输入输出参数一节。

    你只能传递变量给输入输出参数。你不能传入常量或者字面量,因为这些量是不能被修改的。当传入的参数作为输入输出参数时,需要在参数名前加 & 符,表示这个值可以被函数修改

    //输入输出参数
    func swapValue(valueA: inout Int,valueB : inout Int){
        
        let valueTemp = valueA
        valueA = valueB
        valueB = valueTemp
        
    }
    
    var value1 = 11
    var value2 = 22
    swapValue(valueA: &value1, valueB: &value2)
    print("new 1:\(value1),new 2:\(value2)")
    
    
    
    函数类型

    每个函数都有种特定的函数类型,函数的类型由函数的参数类型和返回类型组成。

     func swapValue(valueA: inout Int,valueB : inout Int)
     的类型: (Int:Int)-> Int
     
     func swapValue2()
     的类型: () -> Void
    
    使用函数类型

    Swift中,使用函数类型就像使用其他类型一样。例如,你可以定义一个类型为函数的常量或变量,并将适当的函数赋值给它:

    //使用函数类型
    
    func addTwoInts(_ a: Int, _ b: Int) -> Int {
        return a + b
    }
    
    var addTest : (Int,Int)->Int = addTwoInts
    
    print("\(addTest(2,3))")
    
    嵌套函数

    到目前为止,本章节我们所见到的函数都称之为全局函数(global functions),他们定义在全局域中,你可以把函数定义在别的函数体中,称之为嵌套函数(nested functions)
    默认情况下,嵌套函数是对外界不可见的,但是可以被它们的外围函数(enclosing function)调用。一个外围函数也可以返回它的某一个嵌套函数,使得这个函数可以在其他域中被使用。

    // 嵌套函数
    
    func moreFun(x : Int , y : Int) ->  Int {
        
        func func1(p1 : Int) -> Int{
            
            return p1 + 10
        }
        
        func func2(p2 : Int) -> Int{
            
            return p2 + 20
        }
        
        return func1(p1: x) + func2(p2: y)
        
    }
    
    
    print("嵌套函数返回值:\(moreFun(x: 1, y: 2))")
    //result:33
    

    相关文章

      网友评论

          本文标题:Swift函数_6

          本文链接:https://www.haomeiwen.com/subject/svbjvxtx.html