Swift 1.2 の @noescape 属性
2023-10-03 23:42:20
質問
Swift 1.2には関数のクロージャパラメータで新しい属性があり、ドキュメントに書いてある通りです。
これは パラメータはこれまで呼び出された (または @ noescapeパラメータとして渡される)、つまり、そのパラメータが呼び出しの寿命より長くはならないことを意味します。 のみであることを示します。
私の理解では、それ以前は
[weak self]
を使ってクロージャにクラスなどの強い参照を持たせず、クロージャの実行時に self を nil かインスタンスにすることができたのですが、今は
@noescape
は、クラスが非活性化された場合、クロージャが決して実行されないことを意味します。私の理解は正しいのでしょうか?
もし私が正しいなら、なぜ私は
@noescape
クロージャを使う必要があるのでしょうか?
どのように解決するのですか?
@noescape
はこのように使うことができます。
func doIt(code: @noescape () -> ()) {
/* what we CAN */
// just call it
code()
// pass it to another function as another `@noescape` parameter
doItMore(code)
// capture it in another `@noescape` closure
doItMore {
code()
}
/* what we CANNOT do *****
// pass it as a non-`@noescape` parameter
dispatch_async(dispatch_get_main_queue(), code)
// store it
let _code:() -> () = code
// capture it in another non-`@noescape` closure
let __code = { code() }
*/
}
func doItMore(code: @noescape () -> ()) {}
追加
@noescape
をつけることで、クロージャがどこかに保存されたり、後で使われたり、非同期に使われることがないことを保証します。
呼び出し側の視点からは、呼び出された関数内で使用されるか、全く使用されないので、キャプチャされた変数の寿命を気にする必要はありません。また、おまけとして、暗黙のうちに
self
を使うことができるので
self.
.
func doIt(code: @noescape () -> ()) {
code()
}
class Bar {
var i = 0
func some() {
doIt {
println(i)
// ^ we don't need `self.` anymore!
}
}
}
let bar = Bar()
bar.some() // -> outputs 0
また、コンパイラの観点からは(ドキュメントにあるように リリースノート ):
これは、いくつかの細かいパフォーマンスの最適化を可能にします。
関連
-
[解決済み] Pythonでオブジェクトが属性を持つかどうかを知る方法
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Swiftの@selector()?
-
[解決済み] Swiftで1つのビューコントローラの向きを縦向きのみに固定する方法
-
[解決済み] Swift の @escaping と Completion ハンドラ
-
[解決済み] Swift で型に表示されるテキスト表現を変更するにはどうしたらいいですか?
-
[解決済み] SwiftUIでビューを動的に隠す
-
[解決済み] SwiftUIでリストの左右のパディングを削除する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] クラス 'ViewController' は swift で初期化されません。
-
[解決済み] 小数点以下2桁に切り上げ
-
[解決済み] Swiftの変数に"?"(クエスチョンマーク)と"!"(エクスクラメーションマーク)の装飾を施す。
-
[解決済み] Swift: switch ケースでオプションの値に対するテストを行う
-
[解決済み] NSFetchRequestのインスタンスに型を適用する方法は?
-
[解決済み] Swiftでenumをプロトコルに準拠させるには?
-
[解決済み] swiftの辞書からキーと値のペアを削除するには?
-
[解決済み] Swiftで乱数を生成する
-
[解決済み] Swiftのインライン条件?
-
[解決済み] Swift 3 GCD API変更後のdispatch_once