2016-04-12 29 views
4

我有近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的兩個相互矛盾的語句:(請幫幫忙,我是不是認識什麼不對?請幫助我理解上的差異。

回答

5

在迅速真的沒有任何區別函數和閉包之間。閉包是一個匿名函數(沒有名字的函數。)這就是它,除了語法差異你說。

在Objective-C函數和塊/密封件的不同。

+0

我意識到同樣的:)但一個小疑問:)那麼爲什麼蘋果公司說功能是條款的特殊情況? O'Reilly的意思是「當一個函數作爲一個值傳遞時,它帶有對外部變量的內部引用,這就是函數的一個閉包。」他的意思是什麼使得一個函數成爲閉包。 ?? –

+0

我認爲O'Reilly書(標題是BTW?O'Reilly是出版商,而不是作者)是說,因爲Swift函數帶着它們的封閉範圍,它們是封閉的。) –

+0

hmmmmmm,所以封閉和函數是相同的:|那麼爲什麼蘋果浪費時間設計閉包,並在所有文檔中分別明確解釋:)我投了你的答案:)因爲我覺得一樣:)但是在接受你之前先等待別人回答:)謝謝:) –

5

根據你的文章,看起來你對這個話題有一個非常充分的理解,而你可能會在語義上迷失方向。它基本上歸結爲:

1. a closure is a closure 
2. a function is a closure with a name 

這是一個帖子,更多的細節。但是,它又是一個關於語義的討論。 「答案」非常簡單。

What is the difference between functions and closures?

+0

斯科特:這是問題:)我可以找到每一個討論在線討論只關於語義:) lemme看看你發佈的鏈接:)感謝您的答案:) –

+0

@SandeepBhandari - 我聽到你。似乎你真正的問題是「爲什麼蘋果使用這種措辭,而O'Reilly使用這種措辭」而不是「封閉和函數之間的區別作爲迅速的論點」我再次認爲你有第二個問題的答案......我想,我不確定第一個答案是什麼,但只要你有興趣搜索......這就是最重要的。 ;) – scootermg

+0

只是好奇地知道實際上是在這些行中有任何隱藏的意思:P試圖閱讀的行之間太多我猜:P是啊,你的和Ducan的答案是正確的我猜:)但我只能接受一個人的答案接受:)基於時間接受他的答案,雖然你已經回答完全一樣:)已經上漲了你的答案,但:)雖然感謝幫助哥們:) –

相關問題