Swift スコープ内Finally的なステートメント defer

Swift スコープ内Finally的なステートメント defer

deferはスコープを出る直前に実行できるコードを指定できます。Finally的な使い方ができます。Unsafeなallocate()をdeallocate()する場合に便利です。

public func test() -> Void{
	defer { print("Start defer") }
	print("Start Function")
}

上記コード例の場合結果は下のようになります。

public func test() -> Void{
	defer { print("Start defer 1") }
	defer { print("Start defer 2") }
	print("Start Function")
}

上記コードのようにdeferを複数いれることもできます。

この場合の結果は下記です。

Start Function
Start defer 2
Start defer 1

“Start defer 1”が一番最後に実行されました。

deferは、for などのスコープ内で利用することもできます。

public func test() -> Void{
	for i in [1,2,3] {
		defer { print("Statement defer \(i)") }
		print("Statement \(i)")
	}
	defer { print("Function defer") }
	print("Function Start")
}

上記コードを実行した場合下記のような結果でした。

【Xcode 12】macOS SwiftUI App AppDelegateを作る

Xcode 12 は 「Life Cycle: SwiftUI App」と言う設定ができるようになりました。

Life Cycle 「SwiftUI App」

protocol App継承で下記のようなシンプルな構成になりました。そして、AppDelegate.swiftがなくなりました。

@main
struct プロジェクト名: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

AppDelegateが必要な場合は、下記のようなAppDelegateクラスを用意します。

import Foundation
import Cocoa
class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ aNotification: Notification) {

    }
    
    func applicationWillTerminate(_ aNotification: Notification) {
        
    }
}

struct プロジェクト名:App{}側に@NSApplicationDelegateAdaptor()を追記してやります。

@main
struct プロジェクト名: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED