• [Swift系列]003- 函数


    【基础】

      Swift函数格式:

      1.定义格式:

         func   函数名(参数名1:数据类型,... ,参数名n:数据类型) -> (返回值类型1,...,返回值类型n){

               ///函数体内语句

         }

      2.调用格式:

         函数名(形参列表)

         函数名(形参列表). 返回值索引

      例子:

    func greet(name: String , day: String) -> String{
          return "Hello (name), today is (day)."  
    }
    
    greet("Bob","Tuesday")

      

      吐槽:

      苹果终于把那让人恶心的函数格式改过来了,记得当初刚学obj-c的时候,那个叫难受!

      不过为了保持“不落俗套”,返回值类型又被扔到最后了,苹果你在这些语法格式上要毛个性呀!难道不能跟java/C++/C#统一么?

      好在调用时,回归自然了,当时看到那一个方括号套一个方括号就反胃。

      3 .返回多值

       从格式上可以看出,Swift和传统函数不同,允许一个函数返回多个值

       返回的值可以用 函数名(形参列表). 返回值索引 来各自获取,索引从0开始,如:

    func getPerson()->(String,Int16,String)
    {
       return("张三",16,"男")
    }
    
    println(getPerson().0+"今年"+String(getPerson().1)+"岁,性别:"+getPerson().2);

    4. Swift函数可以用...来获取不固定个数参数

    func sumOf(numbers:Int...)->Int{
        var sum=0
        for number in numbers{
            sum+=number
        }
        return sum
    }
    sumOf()
    sumOf(2,5) sumOf(
    42,597,12,55)

     请注意,这个是可变参数个数,和数组参数不同,可以对比:

    func sumOf(numbers:Int[])->Int{
        var sum=0
        for number in numbers{
           sum+=number
        }
        return sum
    }
    //sumOf()
    sumOf([42,597,12,55])

    第二段代码用的是数组,虽然数组中项个数不固定,但参数必须是一个数组

    【高级】

    5.函数重载

     Swift中,函数名相同、参数不同就可以重载,返回值类型和个数不影响

     但注意!函数名相同、参数相同、返回值个数或类型不同不算重载,是错误,因为系统调用函数时无法区分。

    6.局部函数

     Swift中,允许在函数中嵌套定义局部函数,局部函数只能使用在它所定义的函数中,不能在外部使用,如:

    func rf()->Int{
        var y=10
        func add(){
            y+=5
        }
        add()
        return y
    }
    rf()
    
    add()  // 系统报错

    7. 以函数作为函数的返回值类型

     函数是first-class type(一流类型?暂时没找到这个概念),所以函数可以将其他函数作为它的返回值

     例如:

    //创建以函数add作为返回值的函数makeInc
    func makeInc()->(Int->Int){
        func add(number:Int)->Int{
            return 1+number
        }
        return add
    }
    //inc获取到函数makeInc的值,所以inc就成了add
    var inc=makeInc()
    inc(7)

      有函数指针,用这个到底有什么意义?才疏学浅,等待大牛解惑~

    8. 函数作为其它函数的参数

       以函数作为参数,将别的函数逻辑带入到当前函数中

    func hasAnyMatches(list:Int[],condition:Int->Bool)->Bool{
        for item in list{
            if condition(item){
                return true
            }
        }
        return false
    }
    
    func lessThanTen(number:Int)->Bool{
        return number<10
    }
    
    var numbers=[20,19,1,12]
    
    hasAnyMatches(numbers, lessThanTen)

       感觉能用到的可能性不是很大

    9. 临时/匿名 函数:{} closure

      使用块{} 可以定义临时函数,其中要用到关键字“in”来分隔函数头和函数体

      完整格式:

           {(形参列表)-> 返回值类型列表  in  

               ///临时函数体语句

               return 返回值

            }

      下面的代码用到了数组的map()方法,将原数组映射为新数组 

      在临时函数中,写入映射规则,偶数原样不变,奇数变为0

      在swift中,将这种{}结构称为“closure”

    var numbers=[20,19,1,12]
    
    numbers.map({
        (number:Int)->Int in
        if number%2==1{
            return 0}
        else{
            return number}
        })
    
    //结果:[20,0,0,12]

     如果在closure中,如果类型已知,还可以进一步简化写法:

         numbers.map({number in 3*number})  //数组中每个元素值乘三

     而且closure还可以作为最后一个函数参数,比如:

         sort([1,5,3,12,2]) {$0>$1}

     解释:

          上面的sort函数用于排序,有两个重载,上面用的是第二个

          T[] sort(array: T[], pred: (T, T) -> Bool)

          closure {$0>$1}就是参数(T,T)->Bool

          由于google挂了(因为万恶的XXXXXXXX!! 此处省略一万字),百度搜不到,所以这里没法对这个函数

          做进一步解释,咱还没申请苹果99$的账号,也下不到xcode 6的文档,以后再补上说明吧

          看意思,这里的T还有点泛型的味道

      

  • 相关阅读:
    LeetCode-49. Group Anagrams
    LeetCode-242.Valid Anagram
    LeetCode-239.Sliding Window Maximum
    LeetCode-703. Kth Largest Element in a Stream
    LeetCode-225.Implement Stack using Queues
    LeetCode-232.Implement Queue using Stacks
    LeetCode-25. Reverse Nodes in k-Group
    LeetCode-142.Linked List Cycle II
    LeetCode-141. Linked List Cycle
    LeetCode-24.Swap Nodes in Pairs
  • 原文地址:https://www.cnblogs.com/chutianshu1981/p/3779400.html
Copyright © 2020-2023  润新知