Swift具體解釋之三----------函數(你想知道的都在這裡)

來源:互聯網
上載者:User

標籤:關鍵字   編譯錯誤   code   div   not   length   string   normal   閉包   

函數(你想知道的都在這裡)

註:本文為作者自己總結。過於基礎的就不再贅述 ,都是親自測試的結果。如有錯誤或者遺漏的地方。歡迎指正。一起學習。

1、 函數的簡單定義和調用

簡單的無參函數就不再贅述 , name為形參 。也是內部在數名 。

func sayHello(name:String) ->String{    return name+" say: hello"}

調用的時候也非常easy sayHello("zhangsan")
是不是非常easy呀!

2、外部參數名

什麼是外部參數名呢。事實上就是你給形參起得一個有意義的別名,讓別人更理解這個參數的用途 。

func sayHello1(YourNmae name:String,name2:String) ->String{    return name+" say: hello "+name2}

這裡調用的時候要加上這個別名sayHello1(YourNmae: "zhangsan",name2:"lisi")
swift 預設從第二個參數開始自己主動加外部參數名。等於內部參數名 。
假設你不想輸入外部參數名能夠在前面加個底線

//忽略外部參數名func add(a:Int , _ b:Int) ->Int{    return a + b}add(1, 1) //2
3、參數預設值

函數傳入參數的時候能夠給一個預設值,傳參數的時候這個有預設值的可傳可不傳

func plus(a:Int,another b:Int=0) -> Int{    return a+b;}

這裡給b的預設值是0,在調用的時候 print(plus(1)) 得到結果是1 。 plus(1,another:2) 得到結果是3

4、可變參數

可變參數(variadic parameter)能夠接受一個或多個值。函數調用時。你能夠用可變參數來傳入不確定數量的輸入參數。通過在變數類型名後面增加(…)的方式來定義可變參數。

傳入可變參數的值在函數體內當做這個類型的一個數組

func arithmeticMean(numbers: Double...) -> Double {    var total: Double = 0    for number in numbers {        total += number    }    return total / Double(numbers.count)}

這裡numbers被當成了一個數組 arithmeticMean(1,2,3,4,5.5) 得到結果 3.1

也能夠傳String 或者不論什麼其它類型

func say(name:String, content:String ... ){    var str = name;    for item in  content    {        str += item + " "    }    print(str)}

調用say("lily ", content:"like" ,"eat" ,"apple") 結果:lily like eat apple

5、常量參數和變數參數

函數參數預設是常量。試圖在函數體中更改參數值將會導致編譯錯誤

我這裡嘗試去改動name的值,這裡提示我不能改動let value

可是,有時候,假設函數中有傳入參數的變數值副本將是非常實用的。你能夠通過指定一個或多個參數為變數參數,從而避免自己在函數中定義新的變數。變數參數不是常量,你能夠在函數中把它當做新的可改動副本來使用。

這時候我們須要。通過在參數名前加關鍵字 var 來定義變數參數:

func say1(var name:String)->String{    name += "2"    return name;}

調用函數say1("wangwu") 得到結果:wangwu2

6、函數類型(Function Types)

什麼是函數類型呢? 事實上每一個函數都有種特定的函數類型。由函數的參數類型和傳回型別組成。比方上面的say1的函數類型就是(String)->String ,無參數和傳回值的 ()->() 返回Void類型的函數

看下swift中Void事實上是一個空得元組

以下看下怎麼使用函數類型 。

  • 函數類型變數
    var mySay:(String)->String = say1

    跟定義普通的變數一樣 ,把函數類型當普通類型使用就可以,這裡say1 就是我們前面寫的那個函數
    當然我們也能夠利用swift的僅僅能判斷,不指定類型var mySay = say1
    調用的時候跟調用普通函數一樣mySay("hello") 結果:hello2

  • 函數類型作為參數類型

    func sayWord(mySay:(String)->String , name:String)->String{return mySay(name)}

    這裡我們定義了一個函數,須要傳入兩個參數。第一個參數是一個函數類型的 (String)->String, 最後返回一個String .
    調用的時候我們能夠在這裡給它傳一個定義好得函數 sayWord(say1,name: "my")。 結果:my2
    我們也能夠使用閉包sayWord({ "\($0)2" },name: "my") 結果:my2
    在這裡有些人可能還不太瞭解閉包,先不用管下一節會具體介紹 。

  • 函數類型作為傳回型別

    有時候我們須要在不同的情況下使用不同的函數 ,比方我們須要傳入一個數字。這個數字大於0使用Forward ,小於 0 使用 Backward , 當然這裡僅僅是簡單的邏輯,能夠用if - else搞定 ,可是邏輯十分複雜的時候能夠分兩個函數來寫

    來看下範例 :

    func stepForward(input: Int) -> Int {return input + 1}func stepBackward(input: Int) -> Int {    return input - 1}func chooseFunc(distance:Int) -> (Int)->Int{    return distance>10 ? stepBackward:stepForward}

    這裡定義兩個非常easy的函數 ,還是在定義了一個依據傳入參數而選定函數的函數

    var input = 10;for i in 8...14{    input = chooseFunc(i)(input)    print(input)}

    我們在這裡 分別給函數傳入8 –14 ,得到的函數在傳入10 。看下這個數位改變 。結果是 :11 12 13 12 11 10 9 這個應該非常easy理解

7、返回元組

我們的函數也能夠返回一個元群組類型

func minMax( arr:Int ... )->(max:Int,min:Int){    var max = 0    var min = 0    for item in  arr    {        if(item<max)        {            max = item        }        if(item>min)        {            min = item        }    }    return (max,min)}

這是一個非常easy的函數 ,傳入一個可變參數 ,然後求出這寫裡面的最大和最小值 。

調用 :minMax(2,3,5,88,98,-3) 結果 :(.0 -3, .1 98)

可選元組 - 有時候我們函數裡面返回的是一個nil 。所以這是我們就須要把我們的元組寫成可選元組。
注意:(Int,Int)?

與 (Int?

,Int?) 不同, (Int,Int)? 表示整個元組是可選的 而不是每一個元素是可選的

func mm()->(max:Int,min:Int)?

{ return nil}if let c = mm(){ print("aa")}else{ print("bb")}

這段代碼最後輸出的是 bb

8、輸入輸出參數 inout

將函數的參數聲明成inout 這個值能夠在函數中改動 , 然後被傳出函數 替換原來的值 ,所以不能僅僅傳入 字面量 要傳入地址 加 &

var  myDate  =  9func normalFunc(var data:Int){    data = 100}normalFunc(myDate)print(myDate)  //9func inoutFunc(inout data:Int){    data = 100}inoutFunc(&myDate)print(myDate)  //100

能夠看到,普通函數不會改變實參的值。而inout回改變 。傳得時候一定要加上 & ,事實上不加也會爆錯得。。

9、嵌套函數

你能夠把函數定義在別的函數中 叫做嵌套函數 嵌套函數對外界是不可見的

還是我們剛才那幾個函數 ,還能夠這麼玩。

func MychooseFunc(distance:Int) -> (Int)->Int{    func stepBackward(input: Int) -> Int {    return input - 1    }    func stepForward(input: Int) -> Int {        return input + 1    }    return distance>10 ? stepBackward:stepForward}

臨時先這麼多吧, 以後想到什麼再來補充 ,大家能夠收藏了當字典,忘記了來查查使用方法。

學習iOS,有他就夠了。小碼哥視頻。傳智、黑馬、各種swift書籍

Swift具體解釋之三----------函數(你想知道的都在這裡)

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.