swift函數的基本使用

前言

首先說一下今天有趣的事情。
早晨八點多鐘起來 直播敲代碼 畢竟現在是小視頻時代 作爲95後的我 也不能落後 先說好 我不是靠直播來賺錢哦 主要是想遇見移動開發的大神級別的人物 想與他們交個朋友 如果你也是高移動開發的 真想與你交個朋友 一起學習 。
到了中午的時候,自己隨便弄了一下 就吃了點 重要的來了 從下午一點多 敲代碼 敲到快五點的時候 竟然想起來 我還有課 就這樣無緣無故的曠了四節課 煩惱哦。

最近在家裏發現好多的 95後都開始 急功近利 每天都在想着怎麼去搞錢 怎麼去禍害別人 感悟好多 我就不明白 爲什麼不能 靜下心來 學習一門技術 俗話說:三年磨一劍 敢自拍胸膛說 這最後三年 不能在輸了嗎?你敢嗎?反正是 我敢 !
站在巨人的肩上敲出整個世界:第一行代碼就告訴我。

世界在浮誇 ,也離不開格物

什麼是函數

據官方文檔說:函數是一段完成特定任務的獨立代碼片段。你可以通過給函數命名來標識某個函數的功能,這個名字可以被用來在需要的時候“調用”這個函數來完成它的任務。

我個人的理解就是:舉個例子:
比如說你在開發過程中,想要完成登陸功能的模塊,那麼這時,你就可以,把登陸模塊的代碼提取出來,放到一個函數中來進行調用,從而降低你代碼的耦合度。
比如說你在其他地方,又需要進行登陸,那麼你就還可以調用此函數,以完成登陸模塊的功能。 上面也說了 函數是一段完成特定任務的獨立代碼塊。

函數的定義與調用

我們來對比着 官方文檔來進行學習,首先,官方文檔是這樣說的:

func 函數名 (參數名:參數類型) -> 函數返回值類型{
函數的實現代碼
}

這是函數的定義格式。
那下面我們就來 定義各種類型的 函數 並加以 分析 和 總結。

new one():

func ssj(){
    print("歡迎");
}

分析: 我們根據格式來看一下,此函數的函數名是:ssj(),參數是():也就是說 此函數沒有 參數 那肯定也沒有 參數類型了,在看括號後面 也沒有 返回值類型 ,接着就是 函數的實現代碼 打印一個 “歡迎”。

總結:上面的函數是,無參無返回值

new two():

func ssj1() -> Int{
    return "大壞蛋";
}

分析:還是老樣子,首先看 此函數的名字是 ssj1,括號裏面沒有 參數 也沒有 返回值,繼續往下看 有個箭頭 這個是什麼? 等會說。在看返回值類型 是:Int 。函數的實現代碼 怎麼變成了 return了? 下面說。

總結 :先來說一下:此函數是無參數函數。在來說一下上面的兩個問題:箭頭:指定函數返回類型。return:就是返回,意思就是 你箭頭後面跟的是什麼類型 就返回 什麼類型。

return

new Three():

func ssj2(one : Int, two : Int = 2) -> Int{
    return one + two;
}

分析:接着,上面的函數名是ssj2 參數是 :one ,two 參數的類型是:int ,int 。但是第二個參數怎麼有個值? 等下說, 繼續看 指定的返回值類型是 int ,返回的是 兩個參數的和。

總結:此函數是:默認參數值函數:也就是說,我們在調用的時候,可以把帶有默認值的參數 忽略掉。也可以進行傳參。看截圖:在這裏插入圖片描述
xcode提示我們 可以傳一個參數,也可以傳兩個參數。是不是很方便。

在看代碼:

func ssj2(one : Int, two : Int = 2) -> Int{
    return one + two;
}

print(ssj2(one: 2))//4
print(ssj2(one: 2,two: 3))//5

什麼是默認參數函數:在函數體中通過給參數賦值來爲任意一個參數定義默認值(Deafult Value)。當默認值被定義後,調用這個函數時可以忽略這個參數。

new Four():

func come(person: String, from hometown: String) -> String {

return "Hello \(person)!  come to\(hometown)."

}
come(person: "ssj", from: "ss")

分析:函數名:come ,參數:person, hometown,參數類型:String,String ,返回值類型:String 函數體:return “。。。。。”

總結:先說一下:上面的函數是 指定參數標籤 那個from 就是我們指定的參數標籤。

注意:參數標籤 要和 參數名稱 中間有個空格!!

我們爲什麼要指定參數標籤:參數標籤的使用能夠讓一個函數在調用時更有表達力,更類似自然語言,並且仍保持了函數內部的可讀性以及清晰的意圖。

看下調用截圖 你就恍然大悟了:
在這裏插入圖片描述
我標記的地方就是 我們自定義的標籤 ,這次我們不看 函數的返回值 ,我們看一下 調用,自然語言:一個person :ssj 要去 ss 地點。 對嗎? 看結果:

在這裏插入圖片描述
再來看下面的代碼:

func come(_ person: String, from hometown: String) -> String {

    return "Hello \(person)!  come to: \(hometown)."

}

come("ssj", from: "ss")

分析:函數名字:come ,參數名:person ,hometown ,參數值 以及 返回值 類型:String,返回值 :老樣子。

總結: 這裏我就不多說了 ,唯一的一個地方:person 前的_ 是什麼?

我來說一下:_ 的作用是:當我們不想爲某個參數 添加標籤的時候 就可以使用_ 來代替一個明確的參數標籤。

這裏注意了哦:如果一個 參數又一個標籤,那麼在調用的時候 必須使用標籤來標記這個參數。

這裏我又想到了一個 如果 兩個參數的標籤 都使用_替代呢? 小朋友是不是有很多問號?

func come(_ person: String, _ hometown: String) -> String {

    return "Hello \(person)!  come to: \(hometown)."

}

come("ssj", "ss")

在這裏插入圖片描述

new Five():

在這裏插入圖片描述
這裏是什麼意思 ?What ?這邏輯沒毛病呀 !

當我們進行 查看錯誤的原因的時候 Xcode提示 什麼 什麼 什麼 let.

小朋友你是不是有很多問號???

翻譯 你要問什麼意思 我就帶你 翻譯:
在這裏插入圖片描述
那我們也知道 是什麼意思了 該怎麼 解決這個問題?

經過百度 知道了 使用 inout關鍵字 來解決這個問題
在這裏插入圖片描述
加了inout 問題解決了嗎? fack 心裏一百萬個 那啥!繼續百度…
在這裏插入圖片描述
咳咳 咳! 因爲什麼呢?

原因很簡單:在函數中 我們定義的形參 他默認的是:let 就是常量 :不可被修改的量 ,所以我們不能去 修改 行參的值 ,加入我們需要修改 就要 在參數名後 加一個:inout
我們加上了 爲什麼還錯呢? 因爲翻譯說 文本不可變 不可變? 什麼東西可變?變量?

然後我們聲明一個變量 試試。

在這裏插入圖片描述
搞定! 爲什麼會這樣:

首先我們需要了解兩個概念值類型與引用類型, 值類型傳遞的是參數的一個副本,這樣在調用參數的過程中不會影響原始數據。引用類型把參數本身引用(內存地址)傳遞過去,在調用的過程會影響原始數據。
在聲明函數時,在參數前面用 inout修飾,函數內部實現改變外部參數。
所以……。

new Six():

func kebian(num:Int...)->Int{
    
       var one = 0;
       for two in num {
           one += two;
       }
       return one;
    
}

分析:變量名:kebian , 參數:num ,參數類型:int ,返回值類型:int …
上面的 參數int後面的…是什麼? 那她是一個 參數還是 n個參數 ?

總結:上面是一個 可變參數 的函數 。那什麼是可變參數? ,一個函數可以有幾個可變參數呢?

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

一個函數可以有幾個可變參數呢?:
在這裏插入圖片描述

注意:一個函數最多隻能有一個 可變參數!

那她是一個 參數還是 n個參數 ?:

庫克打電話和我說 :

可變參數的傳入值在函數體中變爲此類型的一個數組。例如,一個叫做 numbers 的 Double… 型可變參數,在函數體內可以當做一個叫 numbers 的 [Double] 型的數組常量。

new Seven():

每個函數都有種特定的函數類型,函數的類型由函數的參數類型和返回類型組成。

我在說啥?

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

分析:這兩個函數的類型是 (Int, Int) -> Int,可以解讀爲: “這個函數類型有兩個 Int 型的參數並返回一個 Int 型的值”。

func printHelloWorld() {
    print("hello, world")
}

分析:這個函數沒有 參數 也沒有返回值的函數: 這個函數的類型是:() -> Void,或者叫“沒有參數,並返回 Void 類型的函數”。

總結:以上兩個例子就是:函數的類型:每個函數都有種特定的函數類型,函數的類型由函數的參數類型和返回類型組成。

如何使用函數類型??

func  llll(ong:Int ,two:Int)->Int{
    return ong + two
}

var action : (Int,Int) ->Int = llll

分析:一個llll函數 把返回值 賦值給 action 變量?官方的解釋是:你可以定義一個類型爲函數的常量或變量,並將適當的函數賦值給它
定義一個llll函數 和 action變量 他們的 參數值類型和 返回值類型 相同 即可以賦值。

那麼既然賦值了 我們就可以用 action 來代替 一個函數,
在這裏插入代碼片
這裏我實在是不知道 這樣做 有何用!

func stepForward(input: Int) -> Int {
    return input + 1
}
func stepBackward(input: Int) -> Int {
    return input - 1
}
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    return backwards ? stepBackward : stepForward
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(currentValue > 0)

分析:上面定義了兩個簡單的 函數 他們別是:返回一個比輸入的大一的 ,一個是返回一個比輸入小一的。 他們的參數類型和返回值類型都是 int。

然後有定義了一個:chooseStepFunction函數 他的返回類型是 : (Int) -> Int ,他根據輸入的布爾值 來判斷返回的 函數

最後我們用 chooseStepFunction函數來獲得一個值:ture 返回 stepBackward false返回stepForward 上面我們定義的 currentValue 初始值是3 也就是說:布爾爲真 然後返回的就是 stepBackward 函數 。

從一開始 沒搞懂這個 moveNearerToZero(currentValue); 我最先的是 用print 打印 結果打印的是 funtion ,然後看了官方文檔:一個指向返回的函數的引用保存在了 moveNearerToZero 常量中 我嘗試着把 :moveNearerToZero(currentValue);

結果就OK了 總的來說 還是又點繞的 ,沒關係 多謝謝 就OK了。

總結

說一下 很多人是爲了 寫博客 而寫博客。 我個人觀點就是 :在你把這部分學完之後 ,爲了檢測自己的學習效果 ,用自己的話加上 代碼 和圖片 以及解決問題的 思路,講解出來 ,一方面鍛鍊自己的寫作 ,另一方面知道自己哪裏不足,從而補回不足之處。這是我所想的。但是,你也的記着 ,模仿,要註明出處 :這是 一億IT人才決定的。

今天就到這裏 。有喜歡的,歡迎加入我們的小窩 ,我們一起學習swift,
企鵝羣:934045632 歡迎加入 我們一起 學習 swift

如果上面有錯的 或者沒講到的 還請你多多指教 多多支持 謝謝 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章