swift 筆記 (七) —— 閉包
到這裡,是不是sort已經變得不太容易讀了。。。但還沒完: 對於inline的閉包, swift還提供了Shorthand Argument Names,作為引數的簡寫,以省去引數名, $0代表第一個引數,$1代表第二個引數, $2……. 甚至連 in 都可以省了, 於是 sort呼叫的新版本: reversedNames = sort(names, {$0 > $1}) 操作符函式 上面的sort呼叫已經夠短了,但是對於操作符 > 來說,它需要的是兩個引數,並且返回值為Bool型,這正好符合了sort函式第2個引數所要求的函式形式,於是,我們可以把 > 當作函式,直接放在sort的第2個引數位置: reversedNames = sort(names, >) //人類已經無法阻止閉包的簡化了...... 關於操作符作為函式,如果並不瞭解操作符過載的話,確實不好理解,那麼請問度娘:“操作符過載” 是什麼吧 Trailing Closures 如果,閉包表示式作為函式的最後一個引數的時候,閉包表示式又很長,不能像上面寫成那麼短的形式的話,那麼,可以把閉包表示式,寫在函式呼叫的外面,也就是()的後面,或者是下面: func myCallClosure(closure: () -> ()) { //引數是個函式,名字叫closure而已。。。 closure() //用引數的名字closure, 呼叫傳入的函式 } myCallClosure({}) //我只是放了個空閉包{}在這裡 如果{}中的內容很長,我們可以把{}放在()外面: myCallClosure() { } 這個看起來非常像函式的定義了,但他不是,因為函式名前面沒有 func關鍵字。 現在,我們回來看看sort,他的函式定義,也是最後一個引數要求傳入函式,所以,我們可以把剛剛的sort,變成: reversedNames = sort(names) { $0 > $1 } //我覺得,連closure他爹都很難一眼看出來了。。。 我記得前幾天,有群友,帖了這樣一段程式碼,問:這是什麼意思,今天,我才知道他一定是沒有好好讀手冊!!!!!看下他帖的程式碼:
通過上面閉包的學習,現在是不是很容易看懂這個程式碼就是個閉包了? 只不過map後面沒有寫() 至於這個numbers.map是怎麼用的(numbers是個Array,map是Array的方法),這段程式碼的詳細意思,手冊上都有非常詳盡的講解,我就不列在這裡,也不要再問這個問題了,不要搞得好像自己學習能力很差一樣。。。 Capturing Values 早些時候,提到了閉包可以捕捉並儲存它的外層函式的常量和變數,接下來,我們來看看,有什麼神奇的事情,如果上面的閉包內容都理解了之後,這一段,其實沒啥好說的,直接上官方程式碼:
incrementor是個巢狀函式, 它返回了一個Int, 但是神奇的是,他沒有傳入引數,而是使用了一個叫作runningTotal的外層函式makeIncrementor定義的一個區域性變數,當makeIncrementor返回incrementor函式的時候,實際上是返回了incrementor函式的一個複製出來的實體函式(每次呼叫makeIncrementor的時候都會複製一個新的incrementor函式), 正因為閉包可以儲存它外層函式定義的常量和變數,所以,當外層函式的作用域已經不存在的時候,它依然可以使用那個常量或變數的值:
看到每次呼叫 incrementByTen(),得到的結果在遞增了吧?
這一段,也證明了我上面的猜:每次呼叫makeIncrementor的時候都會複製一個新的incrementor函式 閉包是引用型別
這裡並沒有呼叫 makeIncrementor去複製一個新的函式,而僅僅是定義了一個變數 alsoIncrementByTen 被賦值成了 incrementByTen //這個函式在上面的時候,已經被呼叫了多次,正因為閉包是引用型別,這裡的alsoIncrementByTen實際上只是 incrementByTen 引用的那個之前複製出來的函式的新引用而已,於是,得到的結果是50.
相關推薦
swift 筆記 (七) —— 閉包
閉包 閉包是個自包含的,可以在程式碼中傳遞的“塊”。。。好吧,不糾結定義,繼續。 swift的閉包,有點像C和Objective-C語言裡的 程式碼塊 {……} 閉包可以捕捉並且儲存在它所被定義的那個東西的上下文中定義的常量和變數。 事實上,在上一個筆記——函式,中的
swift文件筆記(七) -- 閉包(Closures)
閉包是自包含的函式程式碼塊,可以在程式碼中被傳遞和使用。Swift中的閉包與 C和 Objective-C中的程式碼塊(b locks)以及其他一些程式語言中的匿名函式比較相似。函式和閉包都是引用型別。 1.閉包表示式語法 閉包表示式語法有如下的一般形式:
Swift學習筆記之閉包
pps eap animate nbsp ssi apps arr 全局 mef 簡介 (真的很簡) 閉包的完整形態是這個樣子的: { (parameters) -> returnType in statements } 寫在一行裏就是
Swift學習筆記7——閉包(Closures)
其實這個閉包可以看做是匿名的函式。 我們先來回想一下函式作為引數的情況 //定義一個函式,它最後的引數是一個函式型別 func doMath(first: Int, second: Int, mathFunc: (Int, Int) -> Int) { pr
swift 關於 尾隨閉包 筆記
override func viewDidLoad() { super.viewDidLoad() self.weisuibibao(index: 12, bibao: {
JavaScript踩坑筆記09---閉包、回撥函式
閉包: 簡單點說,閉包就是一個倉庫,它的作用就是將我們要用的區域性變數暫時儲存起來。 舉例說明。 // 定義一個函式fn,其中有一個區域性變數num function fn() { var num = 10; } 以上例子中,我們在函式fn中定義了一個變數num,所以變數的n
JavaScript教程筆記(8)-閉包函式和IIFE
1 閉包 閉包(closure)是JavaScript語言的一大特色,也是一個難點。理解閉包,首先要理解變數作用域。 作用域有兩種:全域性作用域和函式作用域。函式內部可以訪問全域性變數。 var n = 999; function f() { console.log(
晝貓筆記 JavaScript -- 閉包
本次主要內容是 閉包 閱讀時間: 約 3分鐘 記得點個贊支援支援我哦 初步瞭解 先看下程式碼,輸出結果是多少? 1 function fn1 () { 2 var a = 2 3 function fn2 () { 4
python筆記3 閉包 裝飾器 叠代器 生成器 內置函數 初識遞歸
叠代 bsp 裝飾 turn () col python 生成器 對象 閉包 1, 閉包是嵌套在函數中的 2, 閉包是內層函數對外層函數的變量(非全局變量)的引用(改變) 3,閉包需要將其作為一個對象返回,而且必須逐層返回,直至最外層函數的返回值 閉包例子: def a1
Swift之自動閉包(@autoclosure、@noescape、@escape、??)
@autoclosure(自動閉包) 1:自動閉包,顧名思義是一種自動建立的閉包,用於包裝函式引數的表示式,可以說是一種簡便語法. 2:自動閉包不接受任何引數,被呼叫時會返回被包裝在其中的表示式的值。
Python學習筆記: 閉包
閉包的基本定義 在電腦科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函式閉包(function closures),是引用了自由變數的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函式和與其相關的引用
Swift-非逃逸閉包
非逃逸閉包 //當一個閉包作為引數傳到一個函式中,但是這個閉包在函式返回之後被執行,我們稱該閉包從函式中逃逸。當你定義接受閉包作為引數的函式時,可以在引數名之前標註@noescape,用來指明這個閉包
Swift基礎:將閉包改為逃逸型場景
alt+左鍵 檢視型別 常量 // 定義常量 let a = 10 let b = 20.5 // 常量運算 (X) let result = a + b Binary operator ‘+’ cannot be applied to
題目筆記(閉包,深複製和淺複製,原生js實現Promise)
就面試筆試題的一些筆記: 閉包( 實現add(2)(5) ) 深複製和淺複製 原生js實現Promise △ –>閉包知識: 實現add(2)(5) function add (x) { return functio
swift中解決閉包迴圈引用的幾種方式
import UIKit class ViewController: UIViewController { // VC --strong -- 閉包 // 閉包- strong -- VC
Python學習筆記——利用閉包寫遞增函式
*前言:這篇算是一個總結筆記 利用閉包返回一個計數器函式,每次呼叫它返回遞增整數: 建立生成器: def createCounter(): def f(): x = 0
wift學習筆記之閉包
根據上一節的例子,我們講解此次閉包的編寫 上節例子: 【格式】 {(引數名稱:引數型別)->返回型別 in 閉包函式體} 【舉例】 【閉包函式簡化】 1.由於AutoAdd函式中addFunc這個引數的傳入引數型別和返回型別為Int,那
JS筆記--探討閉包中內部函式在各情況下的可訪問範圍
閉包是指有權訪問另一個函式作用域中的變數的函式,通過通過在一個函式中建立的另一個函式而獲得閉包。首先要說明的是,閉包並不等於匿名函式,匿名函式可以構成閉包,但不等於閉包。 閉包的作用域,曾一直是困擾我多天的問題。為什麼在某些情況下,閉包只
【swift-總結】閉包
其實閉包就是函式 作為條件的函式 閉包表示式 首先宣告一個數組 var names = ["Charis", "Alex", "Ewa", "Barry", "Daniella"] 將這個陣列按照字母排序 宣告一個閉包函式 func bac
[Swift4] Swift筆記 2.0(函式2,閉包,列舉,結構體)
函式,閉包,列舉,結構體 函式多值返回 // 利用 元組 返回多個值 // 利用 陣列 輸入多個值 func calcMaxmain( values :[Int])-> (max :