10-Swift 函數(shù)

0、函數(shù)概念:

  • 函數(shù)相當(dāng)于 OC 中的方法

  • 函數(shù)的格式:

func 函數(shù)名(參數(shù)列表) -> 返回值類(lèi)型{
    代碼塊
    return 返回值
}
  • func 是定義函數(shù)的關(guān)鍵字
  • 如果有多個(gè)參數(shù),參數(shù)列表之間用逗號(hào) “,” 分割,也可以沒(méi)有參數(shù)
  • 使用 “->” 指向返回值類(lèi)型
  • 如果沒(méi)有返回值,返回值類(lèi)型為 Void,并且 “-> Void” 部分也可以省略,也可以改為 “-> ()”

例:

func test() -> Int{
    return 12;
}

let a = test()      //12

一、函數(shù)的基本使用

  • 參數(shù)、返回值的多種組合
  • 沒(méi)有參數(shù)沒(méi)有返回值
func test11() -> Void{
      print("沒(méi)有參數(shù)沒(méi)有返回值")
}
test11()    //"沒(méi)有參數(shù)沒(méi)有返回值"
  • 有參數(shù)沒(méi)有返回值
func test12(str:String) {
      print("有參數(shù):\(str),沒(méi)有返回值")
}
test12(str: "wangyijiang")      //"有參數(shù):wangyijiang,沒(méi)有返回值"
  • 沒(méi)有參數(shù),有返回值
func test13() -> Int{
      return 13;
}
let a13 = test13()      //13
  • 有參數(shù)有返回值
func test14(a:Int,b:Int) -> Int{
      return a + b
}
let a14 = test14(a: 5, b: 4)    //9
  • 函數(shù)有多個(gè)返回值
func test15(a:Int,b:Int) -> (Int,Int){
    return (a+2,b+3)
}
let a15 = test15(a: 8, b: 7)
a15.0   //10
a15.1   //10

二、函數(shù)的內(nèi)部參數(shù)、外部參數(shù)

  • 內(nèi)參:在函數(shù)內(nèi)部可以看到的參數(shù);

  • 外參:在函數(shù)外部可以看到的參數(shù);

  • 在3.0之后,默認(rèn)情況下,函數(shù)參數(shù)既是內(nèi)參也是外參;

  • 標(biāo)簽的使用:為了讓函數(shù)調(diào)用者知道參數(shù)的意義。

func test21(name str1:String,addr str2:String) -> String{
    return "姓名是:\(str1),家庭住址為:\(str2)"
}
let info21 = test21(name: "王義江", addr: "北京海淀")  //"姓名是:王義江,家庭住址為:北京海淀"
  • 如果不想要外部參數(shù),在前面加下劃線(xiàn) “__” 即可
func test22(name str1:String,_ str2:String) -> String{
    return "姓名是:\(str1),家庭住址為:\(str2)"
}
let info22 = test22(name: "yijiang", "北京海淀")    //"姓名是:yijiang,家庭住址為:北京海淀"

三、默認(rèn)參數(shù)

  • 在某些情況下,如果沒(méi)有傳入具體的參數(shù),可以使用默認(rèn)參數(shù):
func test31(第一個(gè)數(shù) a:Int,第二個(gè)默認(rèn)參數(shù) b:Int = 8,第三個(gè)默認(rèn)參數(shù) c:Int = 6) -> Int{
    return a + b + c
}
  • 調(diào)用方式一:只傳必選參數(shù):
let a311 = test31(第一個(gè)數(shù): 5)   //19
  • 調(diào)用方式二:傳入所有參數(shù):
let a312 = test31(第一個(gè)數(shù): 7, 第二個(gè)默認(rèn)參數(shù): 3, 第三個(gè)默認(rèn)參數(shù): 2)      //12
  • 調(diào)用方式三:傳入必須參數(shù)和任意一個(gè)默認(rèn)參數(shù)組合:
let a313 = test31(第一個(gè)數(shù): 2, 第二個(gè)默認(rèn)參數(shù): 7)      //15
let a314 = test31(第一個(gè)數(shù): 3, 第三個(gè)默認(rèn)參數(shù): 5)      //16

四、可變參數(shù)

  • 當(dāng)輸入?yún)?shù)個(gè)數(shù)不確定時(shí),可使用可變參數(shù)
func test41(a41:Int...) -> Int{
    var temp = 0
    for value in a41 {
        temp += value
    }
    return temp
}
test41(a41: 1,2,3)      //6
  • 注意點(diǎn):所有參數(shù)的類(lèi)型必須要一致,此例中都為 Int 類(lèi)型

  • 可變參數(shù)在函數(shù)內(nèi)部當(dāng)作數(shù)組來(lái)處理;在函數(shù)外面,直接傳遞過(guò)來(lái)多個(gè)參數(shù),每個(gè)參數(shù)都是獨(dú)立的個(gè)體

  • 參數(shù)為數(shù)組時(shí)的比較:

func test42(a42:Array<String>) -> String{
    var temp:String = ""
    for value in a42 {
        temp += value
    }
    return temp
}
test42(a42: ["yijiang","wang"])     //yijiangwang
  • 傳入的參數(shù)是一個(gè)數(shù)組,是一個(gè)整體

五、函數(shù)使用注意點(diǎn):

  • 在函數(shù)內(nèi)部,默認(rèn)接受到的參數(shù)被賦值給一個(gè)常量,是不允許修改的;
  • 引用類(lèi)型(指針的傳遞):關(guān)鍵字 inout。
func test51( a51:inout Int, a52:inout Int){
    let temp = a51
    a51 = a52
    a52 = temp
}
var b51 = 20
var b52 = 10

test51(a51: &b51, a52: &b52)
b51    //10
b52    //20
  • 函數(shù)的嵌套使用
    Swift 中,允許函數(shù)進(jìn)行嵌套使用
func test52(){
    
    func test53(){
        print("第二層函數(shù)")
    }
    
    print("第一層函數(shù)")
    test53()
}
test52()
//第一層函數(shù)
//第二層函數(shù)

六、函數(shù)的類(lèi)型

  • 概念:每個(gè)函數(shù)都有屬于自己的類(lèi)型,由參數(shù)類(lèi)型和返回值類(lèi)型組成
func testAdd61(a61:Double,b61:Double) -> Double{
    return a61 + b61
}
//函數(shù)的類(lèi)型為:(Double, Double) -> Double
func testMultipul62(a62:Double,b62:Double) -> Double{
    return a62 * b62
}
//函數(shù)的類(lèi)型為:(Double,Double) -> Double
  • 使用
  • 函數(shù)作為另外一個(gè)函數(shù)的參數(shù)
func test63(a63:Double,b63:Double,method:(Double,Double) -> Double){
      method(a63, b63)
}
test63(a63: 5, b63: 6, method: testAdd61)   //11
test63(a63: 5, b63: 6, method: testMultipul62)     //30
  • 函數(shù)作為另外一個(gè)函數(shù)的返回值
func test64(str:String) -> (Double,Double) -> Double{
      if str == "add" {
        return testAdd61
      }else{
        return testMultipul62
      }
}
test64(str: "add")(3,4)     //7
test64(str: "123")(3,4)     //12

此時(shí),可以將返回值類(lèi)型放在 () 中,更有層次感:

func test64(str:String) -> ((Double,Double) -> Double){
      if str == "add" {
        return testAdd61
      }else{
        return testMultipul62
      }
}
test64(str: "add")(3,4)     //7
test64(str: "123")(3,4)     //12
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容