2016-09-25 92 views
1

我知道我應該在閉包中使用self來訪問實例變量,如果我不這樣做,Xcode會顯示錯誤,但是當我在關閉reduce方法時忽略了自我時,我沒有收到錯誤。 在這種情況下,我可以省略自己嗎?在map或reduce方法中訪問實例變量時可以省略self嗎?

情況下的

gridsCount = (0..<collectionView!.numberOfSections()).reduce(0) { [weak self] (sum, section) -> Int in 
    return sum + self.gridsInSection(section) 
} 

情況B

gridsCount = (0..<collectionView!.numberOfSections()).reduce(0) { (sum, section) -> Int in 
    return sum + gridsInSection(section) 
} 

回答

1

@noescape關鍵字在函數聲明的存在,爲什麼你可以在塊省略self之所以規定:

@warn_unused_result @rethrows func reduce<T>(initial: T, 
    @noescape combine: (T, Self.Generator.Element) throws -> T) rethrows -> T 

Xcode 6 release notes

@noescape屬性可以在閉合的參數被用於功能。這表明該參數只被調用過(或在呼叫中作爲@noescape參數傳遞),這意味着它不能超過呼叫的生命週期。

這會啓用一些次要的性能優化,但更重要的是禁用閉包參數中的self.要求。

@noescape防止self被保留,其是使用封閉運行,在您確定self將是在執行的過程中存活,其中以同步的方式完全確定。

如果關閉將被用作完成塊某種異步操作,如網絡請求的,由畫廊等檢索媒體文件,你需要巨資對self保留活路塊內,你不要用@noescape來標記它。

+0

感謝您的詳細解答。 –