Swift(五)函數(shù)

更新:2018.05.24

整理了一下demo:SwiftDemo


  • 函數(shù)是一個組織在一起的程序代碼集合凉驻,用來完成某一個特定的功能甩鳄。
  • Swift使用關(guān)鍵字`func進行函數(shù)的定義蚤氏。
  • 定義一個函數(shù)時,可以定義一個或多個不同名稱、類型的值戚扳,作為函數(shù)的輸入?yún)?shù)。當函數(shù)完成是族吻,將返回出書定義的類型帽借。
  • 每個函數(shù)都有一個函數(shù)名來描述它的功能珠增。通過函數(shù)名以及對應(yīng)類型的參數(shù)值,可以調(diào)用這個函數(shù)砍艾,函數(shù)的參數(shù)傳遞順序必須與參數(shù)列表中的順序相同蒂教。

函數(shù)格式如下:

func 函數(shù)名(參數(shù)變量: 類型, 參數(shù)變量: 類型) -> 返回類型 {
        
    }
  • 沒有參數(shù)也沒有返回值
func buildSubviews() {
       
}
  • 有參數(shù)沒有返回值
func tableView(tableView: UITableView) {
        
}
  • 沒有參數(shù)有返回值
func buildHeaderView() -> UIView {
      
    }
  • 有參數(shù)有返回值
func sum(num1: Int, num2: Int) -> Int {
      
}

當調(diào)用包含多個參數(shù)的函數(shù)時,必須要傳遞形同數(shù)量的參數(shù)脆荷。

為參數(shù)設(shè)置默認值

  • Swfit中凝垛,可以為函數(shù)的參數(shù)設(shè)置默認值。
func sum (x:Int = 1, y:Int = 2) -> Int { 
    return x+y
}

在開發(fā)中蜓谋,有的時候就會遇到需要默認值的函數(shù)梦皮,如上,等號后面的就是默認值桃焕。當函數(shù)中有一個傳入?yún)?shù)沒有傳入時剑肯,就會采用默認值。

設(shè)置可變的參數(shù)數(shù)量

  • 定義函數(shù)時观堂,如果不能確定傳入?yún)?shù)的數(shù)量让网,可通過變量類型后面加入...定義變量參數(shù)。
  • 一個函數(shù)最多能有一個變量參數(shù)师痕,且必須是函數(shù)表中的最后一個溃睹。
  • 一個函數(shù)如果有一個或多個參數(shù),變量參數(shù)一定放在最后胰坟。
    func mean (numbers:Double...) -> Double {
        if numbers.count==0 {
            return 0.0
        } else {
            var temp :Double = 0
            for number in numbers {
                
                temp += number
            }
            return temp/Double(numbers.count)
        }
    }

這是一個求 Double類型平均值的函數(shù)丸凭,第二、三行代碼是為了防止沒有傳入?yún)?shù)導致程序崩潰腕铸。
下面是for循環(huán)累加除參數(shù)數(shù)量惜犀,求平均值。

函數(shù)作為參數(shù)和返回類型

  • 函數(shù)作為參數(shù)
    func smaller (num1:Int, num2:Int) -> Int {
        return(num1 > num2) ? num2 : num1
    }
    func bigger (num1:Int, num2:Int) -> Int {
        return(num1 > num2) ? num1 : num2
    }
    
    func printMathResult(mathFunction:(Int,Int)->Int,num1:Int,num2:Int) {
        print("The result is \(mathFunction(num1,num2))" + ".")
    }

這里是三個函數(shù):

  • 第一個函數(shù)是求最小值 函數(shù)的類型是(Int,Int)->Int
  • 第二個函數(shù)是求最大值 函數(shù)的類型是(Int,Int)->Int
  • 第三個函數(shù)是把mathFunction作為一個參數(shù)傳入狠裹,參數(shù)類型是 (Int,Int)->Int虽界,該函數(shù)的另外兩個參數(shù)是Int,即這個函數(shù)的功能是把后兩個傳入?yún)?shù)通過matchFunction這個作為傳入?yún)?shù)的函數(shù)進行計算涛菠,然后輸出莉御。而matchFunction這個函數(shù)做怎樣的操作,就需我們傳入了俗冻。這也是我們?yōu)槭裁匆獙懙谝粋€和第二個函數(shù)的目的礁叔。
printMathResult(mathFunction: smaller(num1:num2:), num1: 1, num2: 2)
printMathResult(mathFunction: bigger(num1:num2:), num1: 2, num2: 3)
  • 函數(shù)作為返回類型
    func smaller (num1:Int, num2:Int) -> Int {
        return(num1 > num2) ? num2 : num1
    }
    func bigger (num1:Int, num2:Int) -> Int {
        return(num1 > num2) ? num1 : num2
    }
    func chooseFunction(big:Bool) ->(Int,Int)->Int {
        return big ? bigger : smaller
    }

前兩個函數(shù)還是上面的兩個,求最大值和最小值迄薄。
只是這一次它們在第三個函數(shù)中作為返回參數(shù)存在琅关。
如果輸入的big是true的話,就返回求最大值的函數(shù)讥蔽,反之返回求最小值的函數(shù)涣易。
然后我們可以在viewDidLoad()或其他地方進行一些操作

        let function = chooseFunction(big: true)
        print(function(2,4))

我們定義了一個常量画机,并根據(jù)傳入函數(shù)的的參數(shù)值為truebigger函數(shù)賦予function常量。


function的返回值是(Int,Int)->Int

嵌套函數(shù)

接著上面的例子新症,來搞一個嵌套函數(shù)
嵌套函數(shù)步氏,顧名思義就是在函數(shù)中有另外一個函數(shù)。函數(shù)里面的函數(shù)只在本函數(shù)中有作用徒爹。

    func chooseNumber(big:Bool,number1:Int,number2:Int) {
      
        func getSmaller() {
            print((number1>number2) ? number2 : number1)
        }
        
        func getBigger() {
            print((number1>number2) ? number1 : number2)
        }
        
        big ? getBigger() : getSmaller()
        
    }

這個函數(shù)表示荚醒,在chooseNumber函數(shù)中,有兩個函數(shù)即打印最大值函數(shù)getBigger 和打印最小值函數(shù)getSmaller,由傳入的Bool來控制調(diào)用哪個函數(shù)輸出數(shù)值隆嗅。
并且界阁,getBiggergetSmaller只能在函數(shù)chooseNumber中使用。

函數(shù)的輸入輸出參數(shù)

  • 如果想要一個函數(shù)可以修改參數(shù)的值榛瓮,并且這些修改在函數(shù)結(jié)束之后仍然存在,那就可以將參數(shù)定義為輸入輸出參數(shù)巫击,這可以通過在參數(shù)類型的前面加入inout關(guān)鍵字來實現(xiàn)禀晓。
  • 同時,傳入函數(shù)的參數(shù)坝锰,只能是變量粹懒,不能是常量,當傳入的參數(shù)作為輸入輸出參數(shù)時顷级,需要在前面加上&符號凫乖,表示這個參數(shù)值是可以被修改的。

比如交換兩個傳入?yún)?shù)的值

    func swap(num1: inout Int, num2: inout Int) {
        let temp = num1
        num1 = num2
        num2 = temp
    }
        
        var number1 = 2
        var number2 = 3
        swap(num1: &number1, num2: &number2)
        print(number1)
        print(number2) 

常用的內(nèi)置函數(shù)

Swift包含眾多的內(nèi)置函數(shù)弓颈,這里只介紹幾個常用的帽芽,

  • abs絕對值函數(shù)
print(abs(-1))

輸出結(jié)果為1

  • min最小值函數(shù)
print(min(3,4,1))

輸出結(jié)果為1

  • max最大值函數(shù)
print(max(2,5,3,1))

輸出結(jié)果為5

  • filter函數(shù)

filter函數(shù)用于查找在數(shù)組元素中,滿足指定條件的元素翔冀,例如查數(shù)組中1~10能被3整除的數(shù)字导街。

        let numbers = [1,2,3,4,5,6,7,8,9,10]
        
        for i in numbers.filter({$0%3==0}) {
            print(i)
        }

$0表示忽略了參數(shù)名,而使用默認參數(shù)為$0
輸出結(jié)果為:

3
6
9
  • map函數(shù)

map函數(shù)通常用于將數(shù)組中的每個元素纤子,通過指定的方法進行轉(zhuǎn)換搬瑰。例如將數(shù)組中的每個整數(shù)都成3:

        let numbers = [1,2,3,4,5,6,7,8,9,10]
        
        for i in numbers.map({$0*3}) {
            print(i)
        }

輸出結(jié)果為:

3
6
9
12
15
18
21
24
27
30
  • reduce函數(shù)

reduce函數(shù)可以把數(shù)組元素組合計算為一個值,比如將數(shù)組中每個數(shù)字進行加法計算控硼,獲得元素之和泽论。

        let numbers = [1,2,3,4,5,6,7,8,9,10]
        let sum = numbers.reduce(0, {$0+$1})
        print(sum)

第一個參數(shù)為初始值,這里設(shè)置初始值為0了卡乾,就是將 0翼悴,1...到10依次相加。
也可以這樣寫

        let sum2 = numbers.reduce(0, +)
        print(sum2)

省略到上面的閉包幔妨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抄瓦,一起剝皮案震驚了整個濱河市潮瓶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钙姊,老刑警劉巖毯辅,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異煞额,居然都是意外死亡思恐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門膊毁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胀莹,“玉大人,你說我怎么就攤上這事婚温∶柩妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵栅螟,是天一觀的道長荆秦。 經(jīng)常有香客問我,道長力图,這世上最難降的妖魔是什么步绸? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吃媒,結(jié)果婚禮上瓤介,老公的妹妹穿的比我還像新娘。我一直安慰自己赘那,他們只是感情好刑桑,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著募舟,像睡著了一般漾月。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胃珍,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天梁肿,我揣著相機與錄音,去河邊找鬼觅彰。 笑死吩蔑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的填抬。 我是一名探鬼主播烛芬,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赘娄?” 一聲冷哼從身側(cè)響起仆潮,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遣臼,沒想到半個月后性置,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡揍堰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年鹏浅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屏歹。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡隐砸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝙眶,到底是詐尸還是另有隱情季希,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布幽纷,位于F島的核電站式塌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏霹崎。R本人自食惡果不足惜珊搀,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一冶忱、第九天 我趴在偏房一處隱蔽的房頂上張望尾菇。 院中可真熱鬧,春花似錦囚枪、人聲如沸派诬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽默赂。三九已至,卻和暖如春括勺,著一層夾襖步出監(jiān)牢的瞬間缆八,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工疾捍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奈辰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓乱豆,卻偏偏與公主長得像奖恰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容