[SwiftUI] コードスニペット dismiss

SwiftUI2021

     
⌛️ < 1 min.
忘れてしまった時に コピペで使用できるスニペットシリーズ dismiss @ SwiftUI 編

環境&対象

以下の環境で動作確認を行なっています。

  • macOS14.2 RC
  • Xcode 15.1 RC
  • iOS 17.2
  • Swift 5.9

dismiss

SwiftUI では、現在表示されている View を閉じるための仕組みが用意されています。

Apple のドキュメントは、こちら

Sheet のようにモーダル表示されているものや、ナビゲーションスタックから表示されたビュー、ウィンドウ等を閉じるために使用することができます。

以下が、使用例です。以下では、.sheet を使用して表示されたモーダルを閉じるための “close” ボタンの動作に使用しています。

//
//  ContentView.swift
//
//  Created by : Tomoaki Yagishita on 2023/12/10
//  © 2023  SmallDeskSoftware
//

import SwiftUI

struct ContentView: View {
    @State private var showSheet = false
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
            Button(action: { showSheet.toggle() }, label: { Text("Show Sheet") })
                .sheet(isPresented: $showSheet, content: { PopupSheet() })
        }
        .padding()
    }
}

struct PopupSheet: View {
    // - dismiss 参照
    @Environment(\.dismiss) private var dismiss
    var body: some View {
        VStack {
            Text("PopupSheet")
            Button(action: {
                             // dismiss 呼び出し
                dismiss() 
            }, label: { Text("close") })
        }
        .padding()
    }
}

#Preview {
    ContentView()
}

@Environment

以下のように、@Environment(\.dismiss) として定義することで、用意されている dismiss にアクセスすることができるようになります。

@Environment(\.dismiss) private var dismiss

上記を定義することで、使用する準備ができたことになります。

dismiss を使う

実際に使用するのも簡単です。 例えば Button が押下された時のアクションとして 使用してみると 以下のようになります。

Button(action: {
    dismiss()
}, label: { Text("close") })

変数 dismiss を 関数のように呼び出します。(実際には、”syntax sugar for function call syntax” という仕組みで呼び出しが実行されます。)

背景 (syntax sugar for function call syntax)

上記の例で参照している dismiss という変数は、DismissAction という型の変数として定義されたものです。

通常 <変数名>() のように呼び出そうとしても動作しません。意味もよくわかりません・・・

実はこのときには、Swift の “syntax sugar for function call syntax” というものが使用されて解釈・実行されています。

変数dismiss を直接 “dismiss()” とすると、Swift では、dismiss.callAsFunction() という呼び出しに変換されて処理されるため、一見 変数に () をつけて呼び出すことができるように見えています。いわゆる syntax sugar の1つです。

もちろん、インスタンスメソッドとして callAsFunction という名称のメソッドが定義されていないといけません。

この仕組みは、Swift 言語の一部として定義されています。

The Swift Programming Language でのドキュメントは、こちら

まとめ

dismiss を使って、ビューを閉じる

dismiss を使って、ビューを閉じる
  • dismiss は、@Environment(\.dismiss) var <変数名>として参照できる
  • <変数名>() とすることで、ビュー等を閉じることができる
  • <変数名>() として呼び出すことができるのは、Swift の syntax sugar for function call syntax という仕組みのおかげ

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です