Swift之閉包

Swfit的學(xué)習(xí)大致有幾個(gè)重點(diǎn):
元組,可選興,函數(shù),閉包
這些是較之OC有很大不同的地方婶芭,學(xué)會(huì)了這些swift也算是入門了

閉包有三種形式:
全局函數(shù):有名字但不能捕獲任何值。
嵌套函數(shù):有名字着饥,也能捕獲封閉函數(shù)內(nèi)的值犀农。
閉包表達(dá)式:無(wú)名閉包,使用輕量級(jí)語(yǔ)法宰掉,可以根據(jù)上下文環(huán)境捕獲值呵哨。

捕獲值

1、閉包可以在其定義的上下文中捕獲常量或變量轨奄。 即使定義這些常量和變量的原域已經(jīng)不存在仇穗,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值。我認(rèn)為可以理解為捕獲增加了原常量或變量的引用計(jì)數(shù)戚绕。
2纹坐、Swift最簡(jiǎn)單的閉包形式是嵌套函數(shù),也就是定義在其他函數(shù)的函數(shù)體內(nèi)的函數(shù)舞丛。嵌套函數(shù)可以捕獲其外部函數(shù)所有的參數(shù)以及定義的常量和變量耘子。

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

let a = makeIncrementer(forIncrement:10)
print(a())

全局函數(shù)

什么叫全局函數(shù)?全局函數(shù)不能捕獲值球切?啥意思呢谷誓?一陣懵逼。


func testGlobalFunc()
{
//這不是捕獲了外部的value嗎吨凑?
    print(value);
}

testGlobalFunc()

我的理解是這樣的:
全局函數(shù)是定義在類之外的不屬于任何類的函數(shù)捍歪。
寫OC的時(shí)候常常會(huì)用到各種宏定義,但是Swift中沒(méi)有宏,通常是通過(guò)全局常量或者全局函數(shù)來(lái)實(shí)現(xiàn)這一效果.我們只需要建一個(gè)文件(假設(shè)叫Global.swift),把想用的定義在里面,無(wú)須導(dǎo)入頭文件什么的,就可以在全局用啦.
在類中實(shí)現(xiàn)的函數(shù)是成員函數(shù)户辱,也就是我們一般說(shuō)的函數(shù)

//
//  Global.swift
//
//  Created by apple on 2020/3/29.
//

import Foundation
import UIKit

/**
 *   替代oc中的#define,列舉一些常用宏
 */
let kScreenWidth = UIScreen.main.bounds.size.width

// 屏幕的物理寬度
func kScreenWidthFun() ->CGFloat
{
    return kScreenWidth
}

func kScreenHeighFun() ->CGFloat
{
    return UIScreen.main.bounds.size.height
}

一、閉包引入

普通函數(shù)寫法

func square(num:Int)->Int{
   return num*num
}
print(square(num:3))

閉包寫法

let fun1 = {
    (num:Int)->Int in
    return num*num
}
print(type(of:fun1))//fun1類型:(Int) -> Int
print(fun1(4))

閉包表達(dá)式語(yǔ)法
1糙臼、由一對(duì){}開(kāi)始和結(jié)束庐镐;
2、in關(guān)鍵字把閉包分成兩部分:參數(shù)與返回值变逃、閉包體
思考1:demo是不是一個(gè)閉包

let demo = {print("hello")}
print(type(of:demo))// () -> ()

第二部分:閉包縮寫

需求:把我們的java成績(jī)放到了一個(gè)數(shù)組里必逆,定義一個(gè)函數(shù),把大于某個(gè)閾值的成績(jī)返回給我

func getScore(score:[Int],con:(Int)->Bool)->[Int]{
    var newScore = [Int]()
    for item in score{
        if con(item){
            newScore.append(item)
        }
    }
    return newScore
}
var score = [66,89,80,33,100]
print(getScore(score:score,con:{(s:Int)->Bool in return s>40}))

省略1:省略->返回類型(自動(dòng)推斷出返回值是一個(gè)Bool)

print(getScore(score:score,con:{(s:Int) in return s>40}))

省略2:省略參數(shù)類型和括號(hào)(自動(dòng)推斷出參數(shù)類型是Int)

print(getScore(score:score,con:{s in return s>40}))

省略3:?jiǎn)涡斜磉_(dá)式閉包可以省略 return 關(guān)鍵字來(lái)

print(getScore(score:score,con:{s in s>40}))

省略4:省略參數(shù)列表定義揽乱,用0,1等等指代參數(shù)名眉,同時(shí)省略in

print(getScore(score:score,con:{$0>40}))

第三部分:尾隨閉包

使用情景:當(dāng)閉包表達(dá)式作為最后一個(gè)參數(shù)傳遞給函數(shù)時(shí),可以單獨(dú)提出來(lái)
問(wèn)題1:尾隨指的是跟在別人后面 閉包到底跟在誰(shuí)后面凰棉?-函數(shù)后面
問(wèn)題2:用尾隨閉包的好處损拢?提升代碼的可讀性

func printInfo(info:String,printFun:(String)->Void){
    printFun(info)
}

//普通調(diào)用方式
printInfo(info:"hello world",printFun:{s in print(s+"~~~")})

//使用尾隨閉包進(jìn)行調(diào)用
printInfo(info:"hello world"){s in print(s+"~~~")}

閉包是引用類型

let b = a
print(b()) //輸出結(jié)果為20

let c = makeIncrementer(forIncrement:10)
print(c())

逃逸閉包

閉包要出逃,出逃到哪里呢撒犀?逃到函數(shù)外使用探橱!牛掰!
需求:閉包作為一個(gè)參數(shù)傳遞一個(gè)函數(shù)绘证,但是這個(gè)閉包我不立馬使用,先把這個(gè)閉包存起來(lái)哗讥,過(guò)會(huì)再用

var recv:()->Void = {print("")}
var x = 10
//方案一:定義一個(gè)函數(shù)嚷那,接受一個(gè)普通閉包為參數(shù)
func test1(closure:()->Void){
    recv = closure //此段代碼報(bào)錯(cuò),原因是普通閉包作為參數(shù)杆煞,會(huì)在函數(shù)結(jié)束之后被銷毀魏宽,無(wú)法在函數(shù)外使用。
}
test1{
    x=100
}
recv()

// 方案二:逃逸閉包
/*
逃逸閉包特點(diǎn)如下:
1决乎、可以在函數(shù)結(jié)束后使用队询;
2、壽命長(zhǎng)构诚!逃逸閉包聲明周期長(zhǎng)于函數(shù)蚌斩,只要它的引用被其他對(duì)象持有,就不會(huì)隨著函數(shù)結(jié)束而釋放掉
3范嘱、通過(guò)@escaping 指定一個(gè)閉包是逃逸閉包
*/
func test2(closure:@escaping ()->Void){
    recv = closure 
}
test2{
    x = 200
}
recv()
print(x)

逃逸閉包在網(wǎng)絡(luò)訪問(wèn)中會(huì)經(jīng)常用到送膳!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丑蛤,隨后出現(xiàn)的幾起案子叠聋,更是在濱河造成了極大的恐慌,老刑警劉巖受裹,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碌补,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厦章,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門镇匀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人闷袒,你說(shuō)我怎么就攤上這事坑律。” “怎么了囊骤?”我有些...
    開(kāi)封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵晃择,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我也物,道長(zhǎng)宫屠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任滑蚯,我火速辦了婚禮浪蹂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘告材。我一直安慰自己坤次,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布斥赋。 她就那樣靜靜地躺著缰猴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疤剑。 梳的紋絲不亂的頭發(fā)上滑绒,一...
    開(kāi)封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音隘膘,去河邊找鬼疑故。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弯菊,可吹牛的內(nèi)容都是我干的谊却。 我是一名探鬼主播盗扒,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼要门,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼定拟!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蹋嵌,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤育瓜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后栽烂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體躏仇,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恋脚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焰手。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糟描。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖书妻,靈堂內(nèi)的尸體忽然破棺而出船响,到底是詐尸還是另有隱情,我是刑警寧澤躲履,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布见间,位于F島的核電站,受9級(jí)特大地震影響工猜,放射性物質(zhì)發(fā)生泄漏米诉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一篷帅、第九天 我趴在偏房一處隱蔽的房頂上張望史侣。 院中可真熱鬧,春花似錦魏身、人聲如沸惊橱。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)税朴。三九已至,卻和暖如春宙枷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茧跋。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工慰丛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘾杭。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓诅病,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親粥烁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贤笆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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