HOME > deferってどう使う?金魚のフン制御構文
先日サンプルコードを読んでいたらdeferという新しいワードが。Swift2から新しくでてきたGo言語でも 利用されているdeferという処理があるようですので解説です。これは処理の最後に何かを実施するJavaやC#でのtry..catch..finallyの finally部分と似た処理になります。つまるところエラーが発生しようが発生しまいが「処理のあとで何かしたい」時に利用する金魚のフンのような処理です。
参考:Swift 2のdefer文
参考:The defer keyword in Swift 2: try/finally done right
参考:新しい制御構文の追加
参考:Swiftでdeinitまで処理をdeferする
百聞は一見にしかずですのでやってみましょう。
class ViewController: UIViewController {
override func viewDidAppear(animated: Bool) {
print("ステップ 1")
testDefer()
print("ステップ 4") }
func testDefer() {
print("ステップ 2")
defer { print("金魚のフンです") }
print("ステップ 3")
}
}
上の処理を実行すると、、、、以下のような結果に
ステップ 1
ステップ 2
ステップ 3
金魚のフンです
ステップ 4
上のソースコードならステップ2の後に実行されそうですが関数の最後まで処理してから 金魚の糞deferを実行しているのがわかります。
print("ステップ 1")
do {
defer { print("金魚のフン") }
print("ステップ 2")
print("ステップ 3")
}
print("ステップ 4")
この場合はdoで囲った箇所の最後に実行。柔軟性がありますね!
ステップ 1
ステップ 2
ステップ 3
金魚のフンです
ステップ 4
for i in 1...10 {
print ("IN \(i)")
defer { print ("金魚のフン \(i)") }
print ("OUT \(i)")
}
これなんかだと、、、、以下の様になります。
IN 1
OUT 1
金魚のフン 1
IN 2
OUT 2
金魚のフン 2
IN 3
OUT 3
金魚のフン 3
...
金魚のフン 9
IN 10
OUT 10
金魚のフン 10
いろいろ柔軟にも使えるようですので試してみてください!
使えそうな制御構文です!Playgroundではdeferが確認できませんでしたので注意です。
2021-05-14 14:21:41 | WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。
AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、
昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は... |
2021-05-06 14:04:37 | LINEのアニメーションスタンプ制作の落とし穴、、、失敗談
ゴールデンウィークにLINEスタンプを作成してみました。
作り切って申請も通したんですが、意図したアニメーションと違う、、、、
LINEクリエーターの画面だと、アニメーションのプレビュー... |
2021-05-01 18:05:35 | 久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。
忘れないようにメモ
エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。
ターゲット→ex... |
Tweet | |||
|