Swift-函數(shù)和閉包

函數(shù)

使用func聲明一個函數(shù)咬荷。 通過使用它的名稱和括號中的參數(shù)列表來調(diào)用函數(shù)愕提。 使用 - >將參數(shù)名稱和類型與函數(shù)的返回類型分開。

//聲明一個函數(shù)
func greet(person: String, day: String) -> String {
    return "Hello \(person), today is \(day)."
}
//調(diào)用函數(shù)
greet(person: "Bob", day: "Tuesday")

默認情況下荆责,函數(shù)使用它們的參數(shù)名稱作為其參數(shù)的標簽饰躲。 在參數(shù)名稱前寫入自定義參數(shù)標簽牙咏,或者寫入"" _ ""表示不使用參數(shù)標簽。

func greet(_ person: String, on day: String) -> String {//_ 
    return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")

給函數(shù)的參數(shù)添加自定義的標簽

func greet(customName person: String, on day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet(customName:"John", on: "Wednesday")

使用元組制作復(fù)合值 - 例如属铁,從函數(shù)返回多個值眠寿。 元組的元素可以通過名稱或通過下標來引用。

func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
    var min = scores[0]
    var max = scores[0]
    var sum = 0

    for score in scores {
        if score > max {
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }

    return (min, max, sum)
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)

函數(shù)也可以采用可變數(shù)量的參數(shù)焦蘑,將它們收集到數(shù)組中盯拱。

func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(numbers: 42, 597, 12)

函數(shù)可以嵌套。 嵌套函數(shù)可以訪問在外部函數(shù)中聲明的變量例嘱。

func returnFifteen() -> Int {
    var y = 10
    func add() {  //聲明一個嵌套函數(shù)
        y += 5使用外部函數(shù)中聲明的變量
    }
    add()//調(diào)用嵌套函數(shù)
    return y
}
returnFifteen()

函數(shù)是first-class類型狡逢。 這意味著一個函數(shù)可以返回另一個函數(shù)作為它的返回值。

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne // 返回一個函數(shù)
}
var increment = makeIncrementer()//返回的函數(shù)用變量來接收
increment(7) //調(diào)用返回的函數(shù)

函數(shù)可以將另一個函數(shù)作為其參數(shù)之一拼卵。

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {//如果condition函數(shù)返回為true奢浑,則外函數(shù)為true
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)//將判斷的函數(shù)傳入,如果有滿足條件的腋腮,返回為true

閉包

函數(shù)實際上是閉包的特殊情況:稍后可以調(diào)用的代碼塊雀彼。 閉包中的代碼可以訪問在創(chuàng)建閉包的時可用的變量和函數(shù)。 你可以使用大括號({})寫一個沒有名稱的閉包即寡。 使用in將參數(shù)和返回類型從主體中分離徊哑。

var numbers = [20, 19, 7, 12]
let num = numbers.map({
    (number: Int) -> Int in   //拿到變量和函數(shù)
    let result = 3 * number  //對變量和函數(shù)進行操作
    return result //返回結(jié)果
})

如果是一個字典調(diào)用了map,會是下面這種情況

var numbers = ["key1":20, "key2":19, "key3":7, "key4":12]

let num = numbers.map({
    numberA -> Int in //這時的numberA是一個元組
    return numberA.value   //拿到的是字典中的值聪富,如果想要拿到字典中的鍵::numberA.key
})

在以下情況發(fā)生的時候莺丑,你可以簡化閉包的寫法

  • 當一個閉包的類型已經(jīng)知道,例如一個代理的回調(diào)墩蔓,你可以忽略它的參數(shù)的類型梢莽,它的返回類型,或參數(shù)類型和返回值類型奸披。 只有一條語句的閉包會返回這條語句的值昏名。
var numbers = [20, 19, 7, 12]
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)

你可以按數(shù)字來引用參數(shù) - 這個方法在非常短的閉包中尤其有用。 作為函數(shù)的最后一個參數(shù)傳遞的閉包可以緊跟在括號后面阵面。 當閉包是函數(shù)的唯一參數(shù)時葡粒,可以完全省略括號份殿。

var numbers = [20, 19, 7, 12]
let sortedNumbers = numbers.sorted { $0 < $1 }
print(sortedNumbers)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗽交,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颂斜,老刑警劉巖夫壁,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沃疮,居然都是意外死亡盒让,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門司蔬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邑茄,“玉大人,你說我怎么就攤上這事俊啼》温疲” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵授帕,是天一觀的道長同木。 經(jīng)常有香客問我,道長跛十,這世上最難降的妖魔是什么彤路? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮芥映,結(jié)果婚禮上洲尊,老公的妹妹穿的比我還像新娘。我一直安慰自己奈偏,他們只是感情好坞嘀,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霎苗,像睡著了一般姆吭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唁盏,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天内狸,我揣著相機與錄音,去河邊找鬼厘擂。 笑死昆淡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的刽严。 我是一名探鬼主播昂灵,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了眨补?” 一聲冷哼從身側(cè)響起管削,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撑螺,沒想到半個月后含思,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡甘晤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年含潘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片线婚。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡遏弱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出塞弊,到底是詐尸還是另有隱情漱逸,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布居砖,位于F島的核電站虹脯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奏候。R本人自食惡果不足惜循集,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔗草。 院中可真熱鬧咒彤,春花似錦、人聲如沸咒精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽模叙。三九已至歇拆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間范咨,已是汗流浹背故觅。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留渠啊,地道東北人输吏。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像替蛉,于是被迫代替她去往敵國和親贯溅。 傳聞我的和親對象是個殘疾皇子拄氯,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

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