【SwiftUI】プレビュー不要なクラスで Canvas の自動表示を抑止する


モチベーション

SwiftUI の Canvas を使ったプレビューは大変便利ですが、この機能が不要なファイルもあります。

たとえば、iOS アプリ開発における、WindowSceneDelegateAppDelegate です。
これらは UI 以外の実装も担っているので、Canvas の表示は鬱陶しいと思います。

実は、Canvas の自動表示は、import SwiftUI が記載されているかどうかで判定しているみたいなので、記法を工夫することで Canvas の自動表示の抑止ができます。

環境

  • Xcode Version 11.5 (11E608c)
  • Xcode Version 12.0 beta 2 (12A6163b)

Life Cycle

UIKit App Delegate

UIWindowSceneDelegate で SwiftUI に依存しているクラスは、UIHostingController のみなので、UIHostingController のみにインポートを制限します。

import UIKit
import class SwiftUI.UIHostingController

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    // ...
}

このような記法で、Canvas の自動表示抑止できます。

AppKit App Delegate

NSHostingView のみにインポートを制限します。

import Cocoa
import class SwiftUI.NSHostingView

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    // ...
}

SwiftUI App

Xcode 12 からは SwiftUI でアプリのエントリポイントを実装できますが、
ここで登場する App, Scene などは View ではないので、プレビューは不要だと思います。

App, Scene, WindowGroup のみインポートすることで、Canvas を抑止できます。

import protocol SwiftUI.App
import protocol SwiftUI.Scene
import struct SwiftUI.WindowGroup

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}