iOS--Swift學(xué)習(xí)彻桃,從入門到跑路(三)

函數(shù)

(1)Swift定義函數(shù)使用關(guān)鍵字func碎紊,->后定義函數(shù)的返回值類型。

fun runoob (site: String, name: String) -> String {
    return (site)
}
print(runoff (site: "66666"))

無(wú)參數(shù)的函數(shù)

func funcname () -> String{
      return datatype
}

無(wú)返回值的函數(shù)

func getNet (getwork:String){
    print("hhh")
}

(2)元組作為函數(shù)返回值
注:元組與數(shù)組類似琅绅,但是元組中的值可以是任意類型离咐,使用的是方括號(hào)》罴可選元組類型如(Int, Int)?與元組包含可選類型如(Int?, Int?)是不同的.可選的元組類型,整個(gè)元組是可選的昆著,而不只是元組中的每個(gè)元素值县貌。

func minMax (array: [Int]) -> (min: Int, max: Int)? {
    if array.isEmpty {
        return nil
    }
    var currentmin = array[0]
    var currentmax = array[0]
    
    for value in array[1..<array.count]{
        if value < currentmin {
            currentmin = value
        }else if value > currentmax {
            currentmax = value
        }
    }
    return (currentmin, currentmax)
}

(3)函數(shù)的內(nèi)部參數(shù)名和外部參數(shù)名,如果聲明了外部參數(shù)名凑懂,則在調(diào)用函數(shù)的時(shí)候必須使用外部參數(shù)名

func pow(first a: Int, second b: Int)->Int{
    return (a+b)
}
var strr = pow(first:10, second:8)
print(star)

(4)可變參數(shù)煤痕,可接受0或多個(gè)值,在類型后加...來(lái)定義

func fun<M>(remeber: M...){
    for i in remeber {
        print(i)
    }
}

(5)常量,變量及I/O參數(shù)
在函數(shù)的參數(shù)前面加inout關(guān)鍵字摆碉,就可以改變參數(shù)的值塘匣,傳入?yún)?shù)時(shí)需要在參數(shù)前面加&符,表示這個(gè)值可以被修改巷帝。

func swapTwo(a: inout Int, b: inout Int){
    let tempA = a
    a=b
    b=tempA
}
var x = 1
var y = 5
swapTwo(a: &x, b: &y)

(6)使用函數(shù)類型忌卤,就像定義其他類型的值一樣

func sum(a: Int, b: Int) -> Int {
    return a+b
}
var addition: (Int, Int) -> Int = sum
// 接下來(lái)就可以使用addition調(diào)用函數(shù)

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

func sum(a: Int, b: Int) -> Int {
    return a+b
}

var addition: (Int, Int) -> Int = sum

func another (addition: (Int, Int) -> Int,a: Int, b: Int){
    print(addition(a, b))
}

another(addition: sum, a: 10, b: 30)

(8)嵌套函數(shù)楞泼,外部的函數(shù)可以調(diào)用內(nèi)部定義的函數(shù)

// 以函數(shù)作為返回值的嵌套函數(shù)
func calcDecrement (forDecrement total: Int) -> Int{
    var overallDecrement = 0
    func decrementer() -> Int{
        overallDecrement -= total
        return overallDecrement
    }
    return decrementer()
}

閉包

(1)閉包的形式有:

全局函數(shù) : 有名字但不能捕獲任何值驰徊。
嵌套函數(shù) : 有名字,也能捕獲封閉函數(shù)內(nèi)的值堕阔。
閉包表達(dá)式 : 無(wú)名閉包棍厂,使用輕量級(jí)語(yǔ)法,可以根據(jù)上下文環(huán)境捕獲值超陆。
(2)閉包語(yǔ)法實(shí)例:

let studname = { print("Swift 閉包實(shí)例牺弹。") }
studname()
//以下閉包形式接收兩個(gè)參數(shù)并返回布爾值:
let divide = {(val1: Int, val2: Int) -> Int in 
   return val1 / val2 
}
let result = divide(200, 20)
print (result)

(3)閉包表達(dá)式
含義:閉包表達(dá)式是一種利用簡(jiǎn)潔語(yǔ)法構(gòu)建內(nèi)聯(lián)閉包的方式。 閉包表達(dá)式提供了一些語(yǔ)法優(yōu)化时呀,使得撰寫閉包變得簡(jiǎn)單明了张漂。

sorted方法:

sorted(by:) 方法,會(huì)根據(jù)您提供的用于排序的閉包函數(shù)將已知類型數(shù)組中的值進(jìn)行排序。返回一個(gè)與原數(shù)組相同(排序后)的數(shù)組退唠,原數(shù)組不會(huì)被修改鹃锈。
sorted(by:)方法需要傳入兩個(gè)參數(shù):
已知類型的數(shù)組
閉包函數(shù),該閉包函數(shù)需要傳入與數(shù)組元素類型相同的兩個(gè)值瞧预,并返回一個(gè)布爾類型值來(lái)表明當(dāng)排序結(jié)束后傳入的第一個(gè)參數(shù)排在第二個(gè)參數(shù)前面還是后面屎债。如果第一個(gè)參數(shù)值出現(xiàn)在第二個(gè)參數(shù)值前面,排序閉包函數(shù)需要返回 true垢油,反之返回 false盆驹。
實(shí)例:

let names = ["AT", "AE", "D", "S", "BE"]

// 使用普通函數(shù)(或內(nèi)嵌函數(shù))提供排序功能,閉包函數(shù)類型需為(String, String) -> Bool。
func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2
}
var reversed = names.sorted(by: backwards)

print(reversed)

(4)參數(shù)名稱縮寫
可以直接通過$0,$1,$2來(lái)順序調(diào)用閉包的參數(shù)滩愁。
實(shí)例:

let names = ["AT", "AE", "D", "S", "BE"]

var reversed = names.sorted( by: { $0 > $1 } )
print(reversed)

(5)運(yùn)算符函數(shù)
實(shí)例:

let names = ["AT", "AE", "D", "S", "BE"]

var reversed = names.sorted(by: >)
print(reversed)

(6)尾隨閉包
格式:

func someFunctionThatTakesAClosure(closure: () -> Void) {
    // 函數(shù)體部分
}

// 以下是不使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAClosure({
    // 閉包主體部分
})

// 以下是使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAClosure() {
  // 閉包主體部分
}

實(shí)例:

let names = ["AT", "AE", "D", "S", "BE"]

//尾隨閉包
var reversed = names.sorted() { $0 > $1 }
print(reversed)

(7)捕獲值
閉包可以在其定義的上下文中捕獲常量或變量躯喇。
即使定義這些常量和變量的原域已經(jīng)不存在,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值硝枉。
實(shí)例:

func makeIncrementor(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementor() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}

let incrementByTen = makeIncrementor(forIncrement: 10)

// 返回的值為10
print(incrementByTen())

// 返回的值為20
print(incrementByTen())

// 返回的值為30
print(incrementByTen())

由于沒有修改amount變量廉丽,incrementor實(shí)際上捕獲并存儲(chǔ)了該變量的一個(gè)副本,而該副本隨著incrementor一同被存儲(chǔ)妻味。
所以我們調(diào)用這個(gè)函數(shù)時(shí)會(huì)累加
(8)閉包是引用類型
如果您將閉包賦值給了兩個(gè)不同的常量/變量正压,兩個(gè)值都會(huì)指向同一個(gè)閉包。
實(shí)例:

func makeIncrementor(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementor() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementor
}

let incrementByTen = makeIncrementor(forIncrement: 10)

// 返回的值為10
incrementByTen()

// 返回的值為20
incrementByTen()

// 返回的值為30
incrementByTen()

// 返回的值為40
incrementByTen()

let alsoIncrementByTen = incrementByTen

// 返回的值也為50
print(alsoIncrementByTen())

本文只是我在菜鳥教程上學(xué)習(xí)的一些自認(rèn)為關(guān)鍵性的總結(jié)责球,如有需要請(qǐng)前往菜鳥教程學(xué)習(xí)焦履。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拓劝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘉裤,更是在濱河造成了極大的恐慌郑临,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屑宠,死亡現(xiàn)場(chǎng)離奇詭異厢洞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)侨把,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門犀变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秋柄,你說我怎么就攤上這事获枝。” “怎么了骇笔?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵省店,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我笨触,道長(zhǎng)懦傍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任芦劣,我火速辦了婚禮粗俱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虚吟。我一直安慰自己寸认,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布串慰。 她就那樣靜靜地躺著偏塞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邦鲫。 梳的紋絲不亂的頭發(fā)上灸叼,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音庆捺,去河邊找鬼古今。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滔以,可吹牛的內(nèi)容都是我干的沧卢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼醉者,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼但狭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起撬即,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤立磁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后剥槐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唱歧,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年粒竖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颅崩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕊苗,死狀恐怖沿后,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朽砰,我是刑警寧澤尖滚,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站瞧柔,受9級(jí)特大地震影響漆弄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜造锅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一撼唾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哥蔚,春花似錦倒谷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至倍靡,卻和暖如春猴伶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塌西。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工他挎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捡需。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓办桨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親站辉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呢撞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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