意外と使えたSwift Playgrounds (SwiftUIを動かす)

最近、5月に購入したmac miniで「SwiftUI」でのプログラミングをちょこちょことしています。

SwiftUIは、AppleがmacOS用に無料公開しているアプリ「Xcode」で扱えるプログラミング言語APIの一つで、SwiftUIを使ってmacやiPhone、iPadなどのアプリを作る事も出来ます。


SwiftUI

SwiftUIはmacOSやiOSのユーザーインターフェイス(UI)の設定を重視して開発されているAPIで、SwiftUIを使うとボタンとか画像表示とかのユーザーインターフェィスの実装が他のmacOS/iOS用の言語、Object-CやSwiftと比べて比較的少ない行のコードで可能になります。

といっても、SwiftUIだけでは細かいカスタマイズには限界があったり、Swift同様にAPIのバージョンが一つ変わるだけでAPIの構文が変更される事が多くある様です。

カスタマイズの限界はまだ仕方が無いのですが、構文の変更については、APIの正しい使い方が不明でStackoverflowといったサイトで解決方法を見つけても違うバージョンのAPI用の答えが混在していたりしていて、参考にしてもエラーしか出ないという場合もしばしば。。

新しいアイデアが次からバンバン出て来てそうなるのか、意図的にAPIのバージョンごとに仕様を変えてSwiftを熟知した人だけにコーディングをし易い様にしているのかは不明ですが、にわかのSwiftUI利用者としては、過去のAPIからの変更がある程度APIのドキュメントに記述されているアンドロイドのAPIに比べると、SwiftUIはかなり使いづらいAPIという (あくまでも個人的な) 印象があります。。。


Swift Playgrounds

Swift Playgrounds アイコン

上記の「Xcode」とは他に、Appleが無料公開している「Swift Playgrounds」というmacOS/iOS用のアプリでも Object-CやSwift、SwiftUIで記述されたPlaygrounds専用のファイルが動かす事が出来ます。

現時点では、Playgroundsファイルの作成と編集はmacOS版の「Xcode」と「Swift Playgrounds」に限定されますが、iOS版の「Swift Playgrounds」でも表示は可能となっています。

なので、SwiftUIの場合はユーザーインターフェース(UI)がどの様に表示されるかといった例をmac上でPlaygroundsファイルとして保存しておくこと、iPhoneで閲覧して確認する事も可能になります。。 が、iOSのバージョンによって実際のUIの表示や表現が違う可能性があると思うので注意が必要かとも。。


PlaygroundsでSwiftUIのコードを動かす

次にPlaygroundsでSwiftUIのViewを表示する方法の例を貼っておきます。

import PlaygroundSupport
import SwiftUI

//SwiftUI View
struct ContentView: View {
    @State private var step = 0

    var body: some View {
        VStack {
            Spacer()
            Group {
                switch (step) {
                case 0:
                    Text("ステップ 0")
                case 1:
                    Text(("ステップ 1")
                default:
                    Text("End")
                }
            }
            Spacer()
            Button(action: {
                step += 1
                 if (3 <= step) { step = 0 }
            }) { Text("Next") }
            Spacer()
        }
        .navigationTitle(Text("SwiftUI Demo"))
        .navigationBarTitleDisplayMode(.inline)
        .navigationViewStyle(StackNavigationViewStyle())
    }
}

//Displays a SwiftUI View.
let viewController = UIHostingController(rootView: ContentView())
let nav = UINavigationController(rootViewController: viewController)
PlaygroundPage.current.liveView = nav

上の例ではコード内で宣言されているContentViewをPlaygrounds上に表示しますが、

  • 1行目の「import PlaygroundSupport」と、
  • 下から3行目にある「UIHostingController(rootView: ContentView())」

が一番重要な部分になります。


終わりに

まだ比較的新しいのが理由かどうかは不明ですが、いくつかのバグが発見されても野放しになっていたり、クラッシュしてもエラーログが確認できなかったりなどの不都合もいくつかあるので今後の改善に期待したいかと思います。

因みに、Playgrounds関連の情報を検索するときに気を付けないといけないのは、検索キーワードに「Swift Playgrounds」と「Swift」のキーワードを含めて検索結果の精度を高くする必要があります。 含めないと👇次の様な結果が出てくる可能性が高くなります。😇😇

「playgrounds」検索結果
「playgrounds」の検索結果

「playground」=「遊び場」となります。。



コメント