例えば以下のような書き方をしたとします。
swift
1var formatter: DateFormatter = DateFormatter()
しかしこれではformatterのインスタンスを生成しただけで、プロパティなどパラメーターが調節できません。
すると、イニシャライザ等でプロパティを設定するはめになるわけですが、
swift
1init() {
2 formatter.dateStyle = .medium
3}
イニシャライザが複数あると初期化が面倒になったり、ソースの位置が宣言と初期化で分離するのが嫌だったりすると、なんとかDateFormatterインスタンス生成時に他のプロパティをセットしたくなります。
他の言語(例えばC#など)ではそれが可能ですが、Swiftにはまだそうした記述方法が無いと思いますので、
これをクロージャを使って実現します。
クロージャの構文はググってみてください。
引数と戻り値をあえて省略せずに書くとこんな感じです。
swift
1lazy var formatter: DateFormatter = { () -> DateFormatter in
2 let formatter = DateFormatter()
3 formatter.dateStyle = .medium
4 return formatter
5}()
ポイントは最後の}の後ろの()
です。これがあると、宣言したクロージャを実行することができます。
つまりformatter初期化の際、クロージャが実行され、内部で生成されたDateFormatter(dateStyleプロパティ調整済み)がメンバ変数のformatterに代入されます。
※おまけとしてlazyが付いていますが、これについては初めてformatterにアクセスした際に初期化を走らせるための修飾子です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/23 13:53