Swift詳解之三----------函數(你想知道的都在這裏)

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

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


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

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

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

調用的時候也很簡單 sayHello("zhangsan")
是不是很簡單呀!

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、常量參數和變量參數

函數參數默認是常量。試圖在函數體中更改參數值將會導致編譯錯誤
error
我這裏嘗試去修改name的值,這裏提示我不能修改let value

但是,有時候,如果函數中有傳入參數的變量值副本將是很有用的。你可以通過指定一個或多個參數爲變量參數,從而避免自己在函數中定義新的變量。變量參數不是常量,你可以在函數中把它當做新的可修改副本來使用。

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

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

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

6、函數類型(Function Types)

什麼是函數類型呢? 其實每個函數都有種特定的函數類型,由函數的參數類型和返回類型組成。比如上面的say1的函數類型就是(String)->String ,無參數和返回值的 ()->() 返回Void類型的函數
pic
看下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
    }
    

    這裏定義兩個非常簡單的函數 ,還是在定義了一個根據傳入參數而選定函數的函數

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

    我們在這裏 分別給函數傳入8 –14 ,得到的函數在傳入10 ,看下這個數字的改變 ,結果是 :11 12 13 12 11 10 9 這個應該很容易理解

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)
}

這是一個很簡單的函數 ,傳入一個可變參數 ,然後求出這寫裏面的最大和最小值 。調用 :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  =  9
func normalFunc(var data:Int)
{
    data = 100
}
normalFunc(myDate)
print(myDate)  //9

func 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書籍

發佈了80 篇原創文章 · 獲贊 12 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章