Closures(閉包)

//閉包 這章有的地方不懂orz

//“閉包是自包含的函數(shù)代碼塊活玲,可以在代碼中被傳遞和使用阱当。Swift 中的閉包與 C 和 Objective-C 中的代碼塊(blocks)以及其他一些編程語(yǔ)言中的匿名函數(shù)比較相似”

//“閉包可以捕獲和存儲(chǔ)其所在上下文中任意常量和變量的引用欧募。被稱為包裹常量和變量艘绍。 Swift 會(huì)為你管理在捕獲過(guò)程中涉及到的所有內(nèi)存操作”

//“在函數(shù)章節(jié)中介紹的全局和嵌套函數(shù)實(shí)際上也是特殊的閉包,閉包采取如下三種形式之一:

    //全局函數(shù)是一個(gè)有名字但不會(huì)捕獲任何值的閉包
    //嵌套函數(shù)是一個(gè)有名字并可以捕獲其封閉函數(shù)域內(nèi)值的閉包
    //閉包表達(dá)式是一個(gè)利用輕量級(jí)語(yǔ)法所寫的可以捕獲其上下文中變量或常量值的匿名閉包

//“Swift 的閉包表達(dá)式擁有簡(jiǎn)潔的風(fēng)格架曹,并鼓勵(lì)在常見場(chǎng)景中進(jìn)行語(yǔ)法優(yōu)化,主要優(yōu)化如下:

    //利用上下文推斷參數(shù)和返回值類型
    //隱式返回單表達(dá)式閉包闹瞧,即單表達(dá)式閉包可以省略 return 關(guān)鍵字
    //參數(shù)名稱縮寫
    //尾隨閉包語(yǔ)法”

//1.閉包表達(dá)式

//1.1 閉包表達(dá)式示例
//“Swift 標(biāo)準(zhǔn)庫(kù)提供了名為 sorted(by:) 的方法绑雄,它會(huì)根據(jù)你所提供的用于排序的閉包函數(shù)將已知類型數(shù)組中的值進(jìn)行排序。一旦排序完成奥邮,sorted(by:) 方法會(huì)返回一個(gè)與原數(shù)組大小相同万牺,包含同類型元素且元素已正確排序的新數(shù)組。原數(shù)組不會(huì)被 sorted(by:) 方法修改漠烧⌒臃撸”

let names = ["chris","alex","ewa","barry","daniella"]
func backward(_ s1: String,_ s2: String)->Bool{
    return s1 > s2
}
var reversedNames = names.sorted(by: backward)
print(reversedNames)

//1.2.閉包表達(dá)式語(yǔ)法

//一般形式
/*
    {(parameters)-> returnType in
        statements
    }
*/

//“閉包表達(dá)式參數(shù) 可以是 in-out 參數(shù),但不能設(shè)定默認(rèn)值已脓。也可以使用具名的可變參數(shù)(注:但是如果可變參數(shù)不放在參數(shù)列表的最后一位的話珊楼,調(diào)用閉包的時(shí)候編譯器將報(bào)錯(cuò),)。元組也可以作為參數(shù)和返回值度液。

//所以上邊的例子可以寫作內(nèi)聯(lián)閉包:
reversedNames = names.sorted(by: {(s1:String,s2:String)->Bool in
    return s1 > s2
})
print(reversedNames)

//“該例中 sorted(by:) 方法的整體調(diào)用保持不變厕宗,一對(duì)圓括號(hào)仍然包裹住了方法的整個(gè)參數(shù)。然而堕担,參數(shù)現(xiàn)在變成了內(nèi)聯(lián)閉包已慢。
//“ 內(nèi)聯(lián)閉包 參數(shù)和返回值類型聲明與 上個(gè)例子中backward(::) 函數(shù)類型聲明相同。在這兩種方式中霹购,都寫成了 (s1: String, s2: String) -> Bool佑惠。然而在內(nèi)聯(lián)閉包表達(dá)式中,函數(shù)和返回值類型都寫在大括號(hào)內(nèi)齐疙,而不是大括號(hào)外膜楷。”
//“閉包的函數(shù)體部分由關(guān)鍵字in引入贞奋。該關(guān)鍵字表示閉包的參數(shù)和返回值類型定義已經(jīng)完成赌厅,閉包函數(shù)體即將開始”

//1.3根據(jù)上下文推斷類型
//“因?yàn)榕判蜷]包函數(shù)是作為 sorted(by:) 方法的參數(shù)傳入的,Swift 可以推斷其參數(shù)和返回值的類型轿塔。sorted(by:) 方法被一個(gè)字符串?dāng)?shù)組調(diào)用特愿,因此其參數(shù)必須是 (String, String) -> Bool 類型的函數(shù)。這意味著 (String, String) 和 Bool 類型并不需要作為閉包表達(dá)式定義的一部分勾缭。因?yàn)樗械念愋投伎梢员徽_推斷揍障,返回箭頭(->)和圍繞在參數(shù)周圍的括號(hào)也可以被省略”
reversedNames = names.sorted(by: {s1,s2 in return s1 > s2})
print(reversedNames)
//“實(shí)際上,通過(guò)內(nèi)聯(lián)閉包表達(dá)式構(gòu)造的閉包作為參數(shù)傳遞給函數(shù)或方法時(shí)俩由,總是能夠推斷出閉包的參數(shù)和返回值類型毒嫡。這意味著閉包作為函數(shù)或者方法的參數(shù)時(shí),你幾乎不需要利用完整格式構(gòu)造內(nèi)聯(lián)閉包采驻∩笈撸”
//“盡管如此,你仍然可以明確寫出有著完整格式的閉包礼旅。如果完整格式的閉包能夠提高代碼的可讀性膳叨,則我們更鼓勵(lì)采用完整格式的閉包”

//1.4 單表達(dá)式閉包隱式返回
//“單行表達(dá)式閉包可以通過(guò)省略 return 關(guān)鍵字來(lái)隱式返回單行表達(dá)式的結(jié)果”

reversedNames = names.sorted(by: {s1,s2 in s1 > s2})
print(reversedNames)

//“在這個(gè)例子中,sorted(by:) 方法的參數(shù)類型 明確了 閉包必須返回一個(gè) Bool 類型值痘系。因?yàn)殚]包函數(shù)體只包含了一個(gè)單一表達(dá)式(s1 > s2)菲嘴,該表達(dá)式返回 Bool 類型值,因此這里 沒有歧義 汰翠,return 關(guān)鍵字可以省略”

//1.5 參數(shù)名稱縮寫
//“Swift 自動(dòng)為 內(nèi)聯(lián)閉包 提供了參數(shù)名稱縮寫功能龄坪,你可以直接通過(guò) $0,$1复唤,$2 來(lái)順序調(diào)用閉包的參數(shù)健田,以此類推》鹑遥”
//“如果你在閉包表達(dá)式中使用參數(shù)名稱縮寫妓局,你可以在閉包定義中省略參數(shù)列表,并且對(duì)應(yīng)參數(shù)名稱縮寫的類型會(huì)通過(guò)函數(shù)類型進(jìn)行推斷呈宇。in關(guān)鍵字也同樣可以被省略”

reversedNames = names.sorted(by: {$0 > $1})
print(reversedNames)
//“這個(gè)例子中好爬,$0和$1表示閉包中第一個(gè)和第二個(gè) String 類型的參數(shù)∩模”

//2. 尾隨閉包
// “如果你需要將一個(gè)很長(zhǎng)的閉包表達(dá)式作為 最后一個(gè)參數(shù) 傳遞給函數(shù)存炮,可以使用尾隨閉包來(lái)增強(qiáng)函數(shù)的可讀性。尾隨閉包是一個(gè)書寫在函數(shù)括號(hào)之后的閉包表達(dá)式蜈漓,函數(shù)支持將其作為最后一個(gè)參數(shù)調(diào)用穆桂。在使用尾隨閉包時(shí),你不用寫出它的參數(shù)標(biāo)簽”

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

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

//使用尾隨閉包進(jìn)行函數(shù)調(diào)用
someFunctionThatTakesAclosure() {
    //閉包主體部分
}
//上一節(jié)例子可以寫為
reversedNames = names.sorted(){$0 > $1}
//如果比表表達(dá)式是函數(shù)或者方法的唯一參數(shù)迎变,則可以把()省略掉
reversedNames = names.sorted{$0 > $1}

//“當(dāng)閉包非常長(zhǎng)以至于不能在一行中進(jìn)行書寫時(shí)充尉,尾隨閉包變得非常有用”
//“Swift 的 Array 類型有一個(gè) map(_:) 方法,這個(gè)方法獲取一個(gè)閉包表達(dá)式作為其唯一參數(shù)衣形。該閉包函數(shù)會(huì)為數(shù)組中的每一個(gè)元素調(diào)用一次驼侠,并返回該元素所映射的值。具體的映射方式和返回值類型由閉包來(lái)指定”

let digitNames = [0:"zero",1:"one",2:"two",3:"three",4:"four",5:"five",6:"six",7:"seven",8:"eight",9:"nine"]
let numbers = [15,58,510]
let strings = numbers.map{
(number)->String in
    var number = number
    var output = ""
    repeat {
    output = digitNames[number % 10]! + output
    number /= 10
    } while number > 0
    return output
}
print(strings)

//“map(:) 為數(shù)組中每一個(gè)元素調(diào)用了一次閉包表達(dá)式谆吴。你不需要指定閉包的輸入?yún)?shù) number 的類型倒源,因?yàn)榭梢酝ㄟ^(guò)要映射的數(shù)組類型進(jìn)行推斷【淅牵”
//“局部變量 number 的值由閉包中的 number 參數(shù)獲得笋熬,因此可以在閉包函數(shù)體內(nèi)對(duì)其進(jìn)行修改,(閉包或者函數(shù)的參數(shù)總是常量)腻菇,閉包表達(dá)式指定了返回類型為 String胳螟,以表明存儲(chǔ)映射值的新數(shù)組類型為 String昔馋。”
//“注意:字典 digitNames 下標(biāo)后跟著一個(gè)嘆號(hào)(!)糖耸,因?yàn)樽值湎聵?biāo)返回一個(gè)可選值(optional value)秘遏,表明該鍵不存在時(shí)會(huì)查找失敗。在上例中嘉竟,由于可以確定 number % 10 總是 digitNames 字典的有效下標(biāo)邦危,因此嘆號(hào)可以用于強(qiáng)制解包 (force-unwrap) 存儲(chǔ)在下標(biāo)的可選類型的返回值中的String類型的值∩崛牛”
//“在上面的例子中倦蚪,通過(guò)尾隨閉包語(yǔ)法,優(yōu)雅地在函數(shù)后封裝了閉包的具體功能边苹,而不再需要將整個(gè)閉包包裹在 map(
:) 方法的括號(hào)內(nèi)陵且。”

//3. 值捕獲
//“閉包可以在其被定義的上下文中捕獲常量或變量个束。即使定義這些常量和變量的原作用域已經(jīng)不存在滩报,閉包仍然可以在閉包函數(shù)體內(nèi)引用和修改這些值〔ゼ保”

//“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
}

//“incrementer() 函數(shù)并沒有任何參數(shù)捶枢,但是在函數(shù)體內(nèi)訪問(wèn)了 runningTotal 和 amount 變量握截。這是因?yàn)樗鼜耐鈬瘮?shù)捕獲了 runningTotal 和 amount 變量的引用。捕獲引用保證了 runningTotal 和 amount 變量在調(diào)用完 makeIncrementer 后不會(huì)消失烂叔,并且保證了在下一次執(zhí)行 incrementer 函數(shù)時(shí)谨胞,runningTotal 依舊存在。
//注意:“為了優(yōu)化蒜鸡,如果一個(gè)值不會(huì)被閉包改變胯努,或者在閉包創(chuàng)建后不會(huì)改變,Swift 可能會(huì)改為捕獲并保存一份對(duì)值的拷貝逢防。 Swift 也會(huì)負(fù)責(zé)被捕獲變量的所有內(nèi)存管理工作叶沛,包括釋放不再需要的變量”

let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()  //返回值為10
incrementByTen()  //返回值為20
incrementByTen()  //返回值為30
//“如果你創(chuàng)建了另一個(gè) incrementor,它會(huì)有屬于自己的引用忘朝,指向一個(gè)全新灰署、獨(dú)立的 runningTotal 變量:”
let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven()  //返回值為7

//“再次調(diào)用原來(lái)的 incrementByTen 會(huì)繼續(xù)增加它自己的 runningTotal 變量,該變量和 incrementBySeven 中捕獲的變量沒有任何聯(lián)系:”
incrementByTen() //返回值為40
//“如果你將閉包賦值給一個(gè)類實(shí)例的屬性,并且該閉包通過(guò)訪問(wèn)該實(shí)例或其成員而捕獲了該實(shí)例溉箕,你將在閉包和該實(shí)例間創(chuàng)建一個(gè)循環(huán)強(qiáng)引用晦墙。Swift 使用捕獲列表來(lái)打破這種循環(huán)強(qiáng)引用”

//4.閉包的引用類型
//“上面的例子中,incrementBySeven 和 incrementByTen 都是常量肴茄,但是這些常量指向的閉包仍然可以增加其捕獲的變量的值偎痛。這是因?yàn)楹瘮?shù)和閉包都是引用類型《览桑”
//“無(wú)論你將函數(shù)或閉包賦值給一個(gè)常量還是變量,你實(shí)際上都是將常量或變量的值設(shè)置為對(duì)應(yīng)函數(shù)或閉包的引用枚赡。上面的例子中氓癌,指向閉包的引用 incrementByTen 是一個(gè)常量,而并非閉包內(nèi)容本身贫橙√巴瘢”
//“這也意味著如果你將閉包賦值給了兩個(gè)不同的常量或變量,兩個(gè)值都會(huì)指向同一個(gè)閉包”

let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()  // 返回50

//5.逃逸閉包
// “當(dāng)一個(gè)閉包作為參數(shù)傳到一個(gè)函數(shù)中卢肃,但是這個(gè)閉包在函數(shù)返回之后才被執(zhí)行疲迂,我們稱該閉包從函數(shù)中逃逸。當(dāng)你定義接受閉包作為參數(shù)的函數(shù)時(shí)莫湘,你可以在參數(shù)名之前標(biāo)注 @escaping尤蒿,用來(lái)指明這個(gè)閉包是允許“逃逸”出這個(gè)函數(shù)的》澹”
//“一種能使閉包“逃逸”出函數(shù)的方法是腰池,將這個(gè)閉包保存在一個(gè)函數(shù)外部定義的變量中。舉個(gè)例子忙芒,很多啟動(dòng)異步操作的函數(shù)接受一個(gè)閉包參數(shù)作為 completion handler示弓。這類函數(shù)會(huì)在異步操作開始之后立刻返回,但是閉包直到異步操作結(jié)束后才會(huì)被調(diào)用呵萨。在這種情況下奏属,閉包需要“逃逸”出函數(shù),因?yàn)殚]包需要在函數(shù)返回之后被調(diào)用”

var completionHandles: [()->Void] = []
func someFunctionWithEscapingClosure(complationHandeler:@escaping ()->Void){
    completionHandles.append(complationHandeler)
}

//“someFunctionWithEscapingClosure(_:) 函數(shù)接受一個(gè)閉包作為參數(shù)潮峦,該閉包被添加到一個(gè)函數(shù)外定義的數(shù)組中囱皿。如果你不將這個(gè)參數(shù)標(biāo)記為 @escaping,就會(huì)得到一個(gè)編譯錯(cuò)誤忱嘹∶保”

//“將一個(gè)閉包標(biāo)記為 @escaping 意味著你必須在閉包中顯式地引用 self。比如說(shuō)德谅,在下面的代碼中爹橱,傳遞到 someFunctionWithEscapingClosure(:) 中的閉包是一個(gè)逃逸閉包,這意味著它需要顯式地引用 self。相對(duì)的愧驱,傳遞到 someFunctionWithNonescapingClosure(:) 中的閉包是一個(gè)非逃逸閉包慰技,這意味著它可以隱式引用 self”

func someFunctionWithNonescapeingClosure(closure:()->Void){
closure()   //閉包類型的定義
}

class SomeClass{
    var x = 10
    func doSomething(){
        someFunctionWithNonescapeingClosure {
            x = 200                                        //閉包內(nèi)容的定義
        }
        someFunctionWithEscapingClosure {
            self.x = 100                                   //閉包內(nèi)容的定義
        }
    }
}

let instance = SomeClass()
instance.doSomething()   //閉包的調(diào)用
print(instance.x)

completionHandles.first?() //閉包的調(diào)用
print(instance.x) 

//6.自動(dòng)閉包
//“自動(dòng)閉包是一種自動(dòng)創(chuàng)建的閉包,用于包裝傳遞給函數(shù)作為參數(shù)的表達(dá)式组砚。這種閉包不接受任何參數(shù)吻商,當(dāng)它被調(diào)用的時(shí)候,會(huì)返回被包裝在其中的表達(dá)式的值糟红。這種便利語(yǔ)法讓你能夠省略閉包的花括號(hào)艾帐,用一個(gè)普通的表達(dá)式來(lái)代替顯式的閉包。

//“下面的代碼展示了閉包如何延時(shí)求值盆偿∑獍郑”
var customersInLine = ["Chris","Alex","Andi","Barry","Edward"]
print(customersInLine.count)
//打印5
let customerProvider = {customersInLine.remove(at: 0)}
print(customersInLine.count)
//打印5
print("Now seving \(customerProvider())")
//打印 Now seving Chris
print(customersInLine.count)
//打印4

//“盡管在閉包的代碼中,customersInLine 的第一個(gè)元素被移除了事扭,不過(guò)在閉包被調(diào)用之前捎稚,這個(gè)元素是不會(huì)被移除的。如果這個(gè)閉包永遠(yuǎn)不被調(diào)用求橄,那么在閉包里面的表達(dá)式將永遠(yuǎn)不會(huì)執(zhí)行今野,那意味著列表中的元素永遠(yuǎn)不會(huì)被移除。請(qǐng)注意罐农,customerProvider 的類型不是 String条霜,而是 () -> String,一個(gè)沒有參數(shù)且返回值為 String 的函數(shù)”

//“閉包作為參數(shù)傳遞給函數(shù)時(shí)涵亏,你能獲得同樣的延時(shí)求值行為蛔外。”
// customersInLine is ["Alex","Andi","Barry","Edward"]
func serve(customer customerProvider:()->String){
print("Now serving \(customerProvider())")
}
serve(customer: {customersInLine.remove(at: 0)})
//打印出 Now serving Alex

//customerInLine is ["Andi","Barry","Edward"]
func severAgain(customer customerProvider: @autoclosure ()->String){
print("Now seving \(customerProvider())")
}
severAgain(customer: customersInLine.remove(at: 0))
//打印 Now serving Andi
//“ 過(guò)度使用 autoclosures 會(huì)讓你的代碼變得難以理解溯乒。上下文和函數(shù)名應(yīng)該能夠清晰地表明求值是被延遲執(zhí)行的夹厌。
//“如果你想讓一個(gè)自動(dòng)閉包可以“逃逸”,則應(yīng)該同時(shí)使用 @autoclosure 和 @escaping 屬性”
//customerInline is ["Barry","Edward"]
var againCustomerProviders: [()->String] = []
func collectCustomerProviders(_ customerProvider: @autoclosure @escaping ()->String){
        againCustomerProviders.append(customerProvider)
}

collectCustomerProviders(customersInLine.remove(at: 0))
collectCustomerProviders(customersInLine.remove(at: 0))
print("collected \(againCustomerProviders.count) closures")
// 打印 collected 2 closures
print(customersInLine)
//打印 [“Barry”裆悄,“Edward”]
for mycustomerPrivider in againCustomerProviders {
print("Now serving \(mycustomerPrivider())")
}
//打印 Now swrving Barry
//打印 Now seving  Edward
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末矛纹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子光稼,更是在濱河造成了極大的恐慌或南,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艾君,死亡現(xiàn)場(chǎng)離奇詭異采够,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)冰垄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蹬癌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事逝薪∮缫” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵董济,是天一觀的道長(zhǎng)步清。 經(jīng)常有香客問(wèn)我,道長(zhǎng)虏肾,這世上最難降的妖魔是什么廓啊? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮封豪,結(jié)果婚禮上谴轮,老公的妹妹穿的比我還像新娘。我一直安慰自己撑毛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布唧领。 她就那樣靜靜地躺著藻雌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斩个。 梳的紋絲不亂的頭發(fā)上胯杭,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音受啥,去河邊找鬼做个。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滚局,可吹牛的內(nèi)容都是我干的居暖。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼藤肢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼太闺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嘁圈,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤省骂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后最住,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钞澳,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年涨缚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轧粟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逃延,靈堂內(nèi)的尸體忽然破棺而出览妖,到底是詐尸還是另有隱情,我是刑警寧澤揽祥,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布讽膏,位于F島的核電站,受9級(jí)特大地震影響拄丰,放射性物質(zhì)發(fā)生泄漏府树。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一料按、第九天 我趴在偏房一處隱蔽的房頂上張望奄侠。 院中可真熱鬧,春花似錦载矿、人聲如沸垄潮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弯洗。三九已至,卻和暖如春逢勾,著一層夾襖步出監(jiān)牢的瞬間牡整,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工溺拱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逃贝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓迫摔,卻偏偏與公主長(zhǎng)得像沐扳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子句占,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • Swift 2.2 我總是覺得 Swift 的語(yǔ)法書有點(diǎn)晦澀迫皱。看的不是那么讓人理解辖众。說(shuō)實(shí)在話卓起,語(yǔ)法書的閉包我看了好...
    Laughingg閱讀 399評(píng)論 0 1
  • 本章將會(huì)介紹 閉包表達(dá)式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動(dòng)閉包枚舉語(yǔ)法使用Switch語(yǔ)句匹配枚舉值關(guān)聯(lián)值原...
    寒橋閱讀 1,563評(píng)論 0 3
  • 以下翻譯自Apple官方文檔戏阅,結(jié)合自己的理解記錄下來(lái)。翻譯基于 swift 3.0.1 原文地址 Closure...
    藝術(shù)農(nóng)閱讀 1,548評(píng)論 0 3
  • 86.復(fù)合 Cases 共享相同代碼塊的多個(gè)switch 分支 分支可以合并, 寫在分支后用逗號(hào)分開啤它。如果任何模式...
    無(wú)灃閱讀 1,379評(píng)論 1 5
  • 今天在去廣州的路上聽了幾個(gè)音頻節(jié)目奕筐,寫下一點(diǎn)感悟吧舱痘。第一個(gè)是聽到和菜頭的一篇文章——《大公司里面的活死人》,大意就...
    duncan圍脖閱讀 206評(píng)論 0 0