我有近4年的Objective C和一個新手快速的經驗。我試圖從Objective C的角度理解swift的概念。所以如果我錯了,請引導我通過:)關閉和函數之間的差異作爲參數在迅速
在目標c中,我們有塊(可以異步執行的代碼塊)絕對完美的感覺。但是現在我們可以將一個函數作爲參數傳遞給另一個函數,這個函數可以稍後執行,然後我們也可以關閉它。
按照蘋果「功能是條款的特例。」
按奧賴利「當一個函數被傳來傳去的價值,它傳遞給外部變量內部引用進行,這是什麼使一個功能的關閉。」
於是,我就一點點地理解同:)
這裏是我的閉合
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a ni
let tempNumber : Int = 5
let numbers = [1,2,3,4,5]
print (numbers.map({ $0 - tempNumber}))
}
被宣佈關閉前的變量tempNumber甚至宣佈,但封有訪問變量。現在,而不是一個地圖,我嘗試使用自定義類傳遞閉包作爲參數,並嘗試執行相同的代碼:)雖然現在閉包得到執行在不同的範圍,它仍然有訪問tempNumber。
我得出結論:閉包有權訪問變量和方法,這些變量和方法在與自己關閉的範圍內聲明,儘管它在不同範圍內執行。
現在,而不是通過關閉作爲參數,則試圖傳遞函數作爲參數,
class test {
func testFunctionAsParameter(testMethod : (Int) -> Int){
let seconds = 4.0
let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
self.callLater(testMethod)
})
}
func callLater(testMethod : (Int) -> Int) -> Int {
return testMethod(100)
}
}
在differrent類我創建的測試實例,並用它作爲跟隨
/* in differrent class */
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a ni
let tempAge : Int = 5
func test2(val : Int) -> Int {
return val - tempAge;
}
let testObj = test();
print(testObj.testFunctionAsParameter(test2))
}
宣佈爲稱爲test的類,它有一個名爲testFunctionAsParameter的方法,該方法依次調用另一個稱爲callLater的方法,最後該方法執行傳遞的函數:)
現在所有這些馬戲團,只是爲了確保通過的方法得到執行在不同的範圍:)
當我執行上面的代碼:)我很震驚地發現,即使函數作爲參數傳遞最終得到執行在不同的範圍,仍然可以訪問與方法聲明在相同範圍聲明的變量testNumber :)
我得出結論:O'Reilly的聲明「當函數作爲值傳遞時,它攜帶其內部引用外部變量「。被轟炸:)
現在我的疑問是蘋果說功能是子句的特例。我認爲特殊情況必須與範圍有關:)但令我驚訝的是,代碼顯示閉包和函數都可以訪問外部範圍內的變量!
其他然後,語法不同如何閉包是不同的函數作爲參數傳遞?現在內部必定存在一些差異,否則蘋果公司不會花太多時間來設計它:)
如果不是範圍??那麼閉包和函數還有什麼不同? O'Reilly說:「當一個函數作爲一個值傳遞時,它會傳遞給它外部變量的內部引用,這就是函數的一個閉包。」那麼它有什麼想指出的呢?該閉包不會攜帶對外部變量的引用?現在他們也不會錯,是嗎?
我要瘋了來自蘋果和O'Reilly的兩個相互矛盾的語句:(請幫幫忙,我是不是認識什麼不對?請幫助我理解上的差異。
我意識到同樣的:)但一個小疑問:)那麼爲什麼蘋果公司說功能是條款的特殊情況? O'Reilly的意思是「當一個函數作爲一個值傳遞時,它帶有對外部變量的內部引用,這就是函數的一個閉包。」他的意思是什麼使得一個函數成爲閉包。 ?? –
我認爲O'Reilly書(標題是BTW?O'Reilly是出版商,而不是作者)是說,因爲Swift函數帶着它們的封閉範圍,它們是封閉的。) –
hmmmmmm,所以封閉和函數是相同的:|那麼爲什麼蘋果浪費時間設計閉包,並在所有文檔中分別明確解釋:)我投了你的答案:)因爲我覺得一樣:)但是在接受你之前先等待別人回答:)謝謝:) –