2.2、函式

weixin_34402408發表於2017-06-28

//: Playground - noun: a place where people can play

import UIKit

//函式:用來完成特定任務的程式碼塊

/*

 函式宣告: 告訴編譯器函式的名字,返回型別及引數

 函式定義: 提供了函式的實體

 func(關鍵字) 函式名稱 (引數名:引數型別,引數名:引數型別..)->函式返回值型別{函式實現部分}

 */

//無參返回值

funcsay(){

    print("hello")

}

say()

//有引數無返回值

funcsayWithName(name:String,age:Int){

    print("say is\(name)")

}

sayWithName(name:"Tom",age:18)

//有引數有返回值型別

funcinfoShow(name:String,age:Int)->String{

    return ("My name is\(name)")

}

letb =infoShow(name:"Tina", age:10)

print(b)

//巢狀函式

funcshowArray(array:[Int]){

    fornuminarray {

        print(num)

    }

    leta = array.count

    ifa>0{

        print("陣列有值")

    }

//    func add(a:Int,b:Int)->Int{

//        return a + b

//    }

//    return add(a: 7, b: 8)

}

showArray(array: [2,3,4,5])

//預設情況下的引數都是內部引數,不能外部使用,外部引數只能外部使用,函式內部不能使用

//函式引數

funcjoinStr(s1:String,s2:String,value s3:String="name")->String{

    returns1+s2+s3

}

joinStr(s1:"1", s2:"2")

joinStr(s1:"1", s2:"2", value:"3")

//注意:如果引數有預設值,需要修改需加上外部引數名

//預設情況下,swift中所有引數都是常量引數,如需要修改需修改變數在函式內重新賦值

funcswapValue(a:Int,b:Int){

    vara = a

    varb = b

    print("交換前a =\(a) b =\(b)")


    lettemp = a

    a = b

    b = temp

    print("交換後a =\(a) b =\(b)")

}

swapValue(a:3,b:4)

//如果想在函式中修改外界傳入的引數,可以在引數的資料型別新增關鍵字inout,這時候傳遞的是引數本身而不是引數的值

varx1 =10

varx2 =20

funcswap3(ax:inoutInt,bx:inoutInt){

    lettemp = ax

    ax = bx

    bx = temp

    print("交換後a =\(x1) b =\(x2)")

}

print("交換前a =\(x1) b =\(x2)")

swap3(ax: &x1, bx: &x2)

/*

 inout 關鍵字補充 swift有兩種引數傳遞方式

 1、值傳遞

 值傳遞是引數的一個副本,這樣在呼叫引數的過程中不會影響原始資料

 2、指標傳遞

 指標傳遞把引數本身引用(記憶體地址)傳遞過去,在呼叫的過程會影響原始資料

 說明上面inout是什麼傳遞? 指標傳遞

 在swift中,只有class是指標傳遞,其餘的比如Int、Float、Bool等都是值傳遞

 有時候我們需要通過一個函式改變函式外面變數的值(將一個值型別引數以引用方式傳遞),這時,Swift提供的inout關鍵字就可以實現

 注意 inout修飾的引數是不能有預設值的,

 一個引數一旦被inout修飾,就不能再用var 或者 let修飾

 */

varvalue =50

funcincrement(value:inoutInt, length:Int) {

    value += length

}

increment(value: &value, length: 20)//系統預設新增了一個&地址符號,說明可以修改原地址資料

print(value)

//如果有多個引數可以使用集合

funcadd(other:Int,nums:Int...)->Int{

    varsum =0

    fornuminnums{

        sum += num

    }

    returnsum


}

add(other:2, nums:1,2,3,4)

//函式實際上是一種特殊的閉包,你可以使用{}來建立一個匿名閉包。使用in將引數和返回值型別宣告與閉包函式體進行分離。

varnumbers = [1,3,4,2,5]

numbers.map({

    (number:Int)->Intin

    letresult =3* number

    returnresult

})

//你可以通過引數位置而不是引數名字來引用引數——這個方法在非常短的閉包中非常有用。當一個閉包作為最後一個引數傳給一個函式的時候,它可以直接跟在括號後面。

print("特殊閉包==",numbers.map({ numberin3* number }))

//map怎麼使用

letmapnumbers = [1,2,3,4]

letresult =mapnumbers.map{ $0 +2}

print(result)  // [3,4,5,6]

//map 方法接受一個閉包作為引數, 然後它會遍歷整個 numbers 陣列,並對陣列中每一個元素執行閉包中定義的操作。 相當於對陣列中的所有元素做了一個對映。 比如我們們這個例子裡面的閉包是講所有元素都加 2 。 這樣它產生的結果資料就是 [3,4,5,6]

/*

 ------------------------------函式型別:

 類似於C語言的指向函式的指標

 類似於OC語言的block

 函式型別是由函式的引數型別和返回值型別組成的

 */

//可以利用函式型別定義函式變數和常量

funcsum(a:Int,b:Int)->Int{

    returna + b

}

funcsub(a:Int,b:Int,c:Int)->Int{

    returna - b

}

// 這兩個函式的型別是 (Int, Int) -> Int

// 函式型別可以作為函式返回值

funcmax(a:Int, b:Int) ->Int

{

    returna > b ? a : b

}

funcsub(a:Int, b:Int) ->Int

{

    returna - b;

}

// 可以利用函式型別定義函式變數和常量

varfuncP:(Int,Int) ->Int=sum

funcP = sub

print(funcP(10,20))

//練習 page130

//1、2 4 //2、為什麼下面程式碼不編譯 4沒有逗號//3、3

//如果statuscode是個有5個元素的元祖,什麼方式去獲取到第五個值 1

相關文章