はじめに
「クロージャ内」では「スコープ外」の変数や定数の値を参照し保持する機能がある。という一部の機能に関しての記事である。
詳細
- 「クロージャー内」では「スコープ外」の変数や定数の値を参照し保持する機能がある。
- (ちなみに)キャプチャするのは値のことではなく、スコープ外にあるキャプチャされた変数や定数自身をキャプチャする
Swift
let greeting: (String) -> String
//doは新しくスコープを作る機能がある。
do {
//doスコープの中の定数symbol。そのため、本来、doスコープ外では値を参照できないはず。
let symbol = "!"
//定数greeting(クロージャーの型定義)はグローバル定数なためどこからでもアクセス可能
greeting = { user in
//ここに注目
//greeting内でsymbolを「キャプチャ」
return "Hello, \(user)\(symbol)"
}
}
//インスタンス化
//greetingクロージャーの引数userの文字列を定義する
greeting("山田") // "Hello, 山田!" <- キャプチャしたsymbolの値もしっかり出力されている
//symbol出力
//クロージャーにキャプチャされていないdoスコープ内にあった普通の定数
print(symbol) // Cannot find 'symbol' in scope <- symbolはスコープ内で見つけることができないエラー
おわりに
スコープ外の変数や定数でもクロージャ内でキャプチャすれば値を参照し保持する。
記事についてご指摘がある方はぜひコメント欄にてご指摘いただけると幸いです。
参考記事
[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者:片岡 巌
出版社:技術評論社
印刷/製本:日経印刷株式会社
開発環境
- Xcode-13.4.1
- Swift version 5.7