首页 > 代码库 > Swift 函数入门

Swift 函数入门

1. swift 中函数是第上类型,所以函数也可以作为参数和返回结果


2. 定义形式     关键字    名字 (参数列表)-> 返回值类型。下面是一个返回元组的例子。

        func addNumber(a:Int,b:Int) -> (addResult : Int, timesResult : Int) {
            
            return(a+b, a*b)
        
        }
        
        let result =  addNumber(1, 2)
        
        println(result.addResult)
传入两个参数 a,b 并把他们相加,相乘的结果以一个元组的形式指返回。可以没有参数,但是必须有代表参数的(),当没有返回值时,->到 { 前的都要省略。这里的没有返回值是指我们没有定义返回值,但是函数实际上会返回一个void值。它其实是一个空的元组,没有任何的元素,可以写成()


3. 函数的参数名称 :

 就如我们上面所看到的函数形式,参数名称 a ,b 只是一个局部的变量,我们只能在自己定义的函 数内使用,不能在外部使用。

假设一个函数有多个参数,我们在使用时可能不知道这些参数的明确意思。这时我们可以使用外部参数名称来解决这个问题。

现在有一个函数要求传入三个函数,父母的身高以及来代码男女的1和2 来求子女的身高。如下:


        
        func getPersonHeight(height1:Float,hieght2:Float,isBoy:Int)  -> Float{
            
            if isBoy == 1 {
            
              return  45.99 + 0.78 * (height1+hieght2) / 2 + 5.29
            
            } else {
              
                return 37.85+0.75 * (height1+hieght2) / 2 + 5.29
            }
        
        }

当我们在别处使用的时候不会提示这三个数所表示的意思,可能会造成传值的错误。现在我们只需要使用参数的外部名称,在调用时也能明确的标明它们的所代表的意思。  参数的外部名称加在局部名称前面,用空格割开。


        
        func getPersonHeight(height1:Float,hieght2:Float,isBoy:Int)  -> Float{
            
            if isBoy == 1 {
            
              return  45.99 + 0.78 * (height1+hieght2) / 2 + 5.29
            
            } else {
              
                return 37.85+0.75 * (height1+hieght2) / 2 + 5.29
            }
        
        }

  当调用没有外部名称时的代码      

         let height = getPersonHeight(170, 180,1);

  当调用有外部名称时的代码 

        let height = getPersonHeight(motehrHeight:170, fatherHeight: 180, oneIsBoy:1);


有外部名称是更加清晰。而且我们可以简写外部参数名。假如我们已经定义了如下函数  

  

func getPersonHeight(motherHeight:Float, fatherHieght:Float,  oneIsBoy:Int)  ->Float


我们的局部函数名已经相当明确了,这时我们只需要在其前面加上  # ,就可以当作外部参数名来使用

        func getPersonHeight( # motherHeight:Float, # fatherHieght:Float,  # oneIsBoy:Int)  -> Float{
            
            if oneIsBoy == 1 {
            
              return  45.99 + 0.78 * (motherHeight+fatherHieght) / 2 + 5.29
            
            } else {
              
                return 37.85+0.75 * (motherHeight+fatherHieght) / 2 + 5.29
            }
        
        }
        
        let height = getPersonHeight(motherHeight: 170, fatherHieght: 190, oneIsBoy: 1)
        println(height)


4. 默认参数: 对于一些非必须赋值的参数我们在写参数时可以给其一个默认的值。下面的代码给性别默认为1 


   

        func getPersonHeight(motherHeight:Float,fatherHieght:Float, oneIsBoy:Int = 1)  -> Float{
            
            if oneIsBoy == 1 {
            
              return  45.99 + 0.78 * (motherHeight+fatherHieght) / 2 + 5.29
            
            } else {
              
                return 37.85+0.75 * (motherHeight+fatherHieght) / 2 + 5.29
            }
        
        }

当我们调用的时候会发现,系统会给有默认值的参数加一个外部名称 :

let height =getPersonHeight(170,180, oneIsBoy: 2)   

不给参数赋值时:  let height = getPersonHeight(170,180)

   

注意: 默认参数必须放在所有参数的最右边,否则会造成调用混乱。


5.可变参数 :  在对数类型后面加 ... 直接看代码  ,求 N 个整数的和 

        func sumOfSomeNumbers(numbers:Int...) -> Int {
            
            var sum: Int = 0
            
            for item in numbers {
            
                sum += item
            }
        
            return sum
        
        }
        
     println(sumOfSomeNumbers(1,2,3,4,5))

注意:可变参数必须放在最右面,当同时默认参数也存在时,可变参数放在最后。

    

6.输入输出参数:

     swif 中参数的传递是值传递,函数内部对参数的修改只发生在函数内部,函数的外边参数是不会发生改变的。如果想要改变传入的参数,我们就需要输入输出参数了,这样的参数在函数内部的改这会保持到函数的外部。 输入输出只需要在 参数名称前加上inout。

  

        func inoutTest(var number: Int) {
           
            number -= 1;
        }
        
        var number = 3;
        
        inoutTest(number)
        
        println(number)

 输出的值 为 3  

下面使用 输入输出函数,输入输出参数调用时要在参数前面加上 &

        func inoutTest(inout number: Int) {
           
            number -= 1;
        }
        
        var number = 3;
        
        inoutTest(&number)
        
        println(number)

 输出的值 为 2

注意: 输入输出参数不能有默认值,而且可变参数不能用 inout 标记。如果你用 inout 标记一个参数,这个参数不能被 var 或者 let 标记。


7.函数的类型 

   在swift 中函数属于第一类型,所以有自己的类型,函数的类型由参数的类型跟返回值的类型决定。


func addTwoInts(a: Int, b: Int) -> Int {
    return a + b
}

  1. 这个函数的类型是  (Int,Int) -> (Int)  .我们就可以定义一下这个类型的变量

         var   addIntsFunc : (Int,Int) -> (Int) = addTwoInts

 

 2.   函数当作参数传递,这时函数的类型显得特别有用。


        func addTwoNumber(addFunction:(Int,Int)->(Int), number1:Int, number2:Int) ->Int {
        
           
              return addFunction(number1,number2)
        }
        
        
        
        func addTwoInt(number1:Int, number2:Int) -> Int {
        
           
            return number2 + number1;
        }
        <pre name="code" class="plain">        func addTwoInt(number1: Int,number2: Int) -> Int {
            return number1 + number2;
        }
        func timesTwoInt(number1: Int,number2: Int) -> Int {
            return number1 * number2
        }
        
        func chooseStepFunction(isAdd: Bool) -> (Int,Int) -> Int {
            return isAdd ? addTwoInt: timesTwoInt;
        }
        
        let function:(Int,Int)->(Int) = chooseStepFunction(false)
        
       println(function(1,2))

println(addTwoNumber(addTwoInt, 1,2));


我们声明了一个 addTwoNumber的函数,他的参数是一个(Int,Int) ->(Int) 类型的函数 和两个Int 类型的数。,然后定义了一个(Int,Int) ->(Int) 类型的函数 addTwoInt函数然后当作参数使用。


3. 函数当作返回值.我们现在定义一个函数,以一个bool 值作为参数,然后返回一个(Int,Int) ->(Int)的函数。代码

        func addTwoInt(number1: Int,number2: Int) -> Int {
            return number1 + number2;
        }
        func timesTwoInt(number1: Int,number2: Int) -> Int {
            return number1 * number2
        }
        
        func chooseCaculateFunction(isAdd: Bool) -> (Int,Int) -> Int {
            return isAdd ? addTwoInt: timesTwoInt;
        }
        
        let function:(Int,Int)->(Int) = chooseCaculateFunction(false)
        
       println(function(1,2))

chooseCaculateFunction  返回了一个 函数 ,根据bool 值决定返回addTwoInt 或 timesTwoInt 函数,然后赋予常量function。调用该常量返回一个Int值并输出。









 


5.


    

      

     

Swift 函数入门