簡體   English   中英

當Swift中存在隱式捕獲的“self”時,是否可以觸發編譯器警告

[英]Can I trigger a compiler warning when there is an implicitly captured “self” in Swift

如果我有一些代碼需要一個閉包,並且隱式捕獲self ,我可以使它導致編譯器警告嗎? 我可以為編譯器命令添加一些標志嗎?

不完全是。 但是有一些東西可以解決你想要這個警告的原因 - 防止關閉捕獲self會導致保留周期的情況......

當閉包作為參數傳遞給函數但在函數返回后使用時 - 閉包的生命周期(及其中捕獲的任何東西)“逃逸”時,閉包中捕獲self的潛在保留周期就出現了。它寫的上下文。 當閉包逃脫時,必須確保它仍然可以訪問它使用的東西(比如self和任何屬性或方法),所以我們進入內存管理和可能的保留周期, [weak self] / strongSelf等。

沒有逃脫1953年1994年沒有逃脫

使用@noescape ,您可以聲明作為參數傳遞給函數的閉包不會轉義調用上下文,因此不需要為閉包執行額外的內存管理開銷。 編譯器可以應用一些其他優化,使運行函數及其閉包更快。

func someFunctionWithNoescapeClosure(@noescape closure: () -> Void) {
    closure()
}

@noescape閉包中,您可以訪問self上的方法/屬性,而無需顯式編寫self. ,因為你不再捕捉self了。 並且,一旦你標記了參數@noescape ,如果你試圖做任何允許它轉義的事情(比如從參數中取出閉包並將它分配給存儲的屬性),你就會得到一個編譯器錯誤 (不僅僅是一個警告)。

有關Apple的完整文章,請參閱Swift編程語言 Nonescaping Closures 這篇文章提供了一個可以進一步解釋的替代視角。

不,我能想到的唯一能做類似事情的是linting。

SwiftLint可能會做類似的事情,如果沒有,你可以為這樣的事情編寫自己的規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM