「SwiftUI 徹底入門」を一読しました。

どうもお久しぶりです。Reo です。

このブログの最終更新日が3月ということに驚きを隠せません。5ヶ月ぶりですね…

最近ようやく重い腰を上げて SwiftUI の勉強を始めました。先ほど1冊読み終わったので、本の紹介をしていこうと思います。1ヶ月以上かけてゆっくり読んでいたので長かった…。

ちなみにSwiftUIに関しては、Apple のチュートリアルもやってません。英語だと重い腰がさらに重くなってしまうのと、本の方がやる気が出るので…。

 

SwiftUI 徹底入門

読んだ本はこちら。SwiftUI 徹底入門です。

目次は以下の通りです。

Chapter01 SwiftUIの概要
Chapter02 SwiftUIのビューを理解する
Chapter03 レイアウトの作り方
Chapter04 SwiftUIにおけるイベント処理の基礎知識
Chapter05 リストビューとスクロールビュー
Chapter06 図形の描画とカスタムビュー
Chapter07 ナビゲーション・シート・タブによる画面の切り替え
Chapter08 アラートとアクションシート
Chapter09 ビューアニメーションとエフェクト
Chapter10 状態とデータフロー
Chapter11 イベントとジェスチャー
Chapter12 UIKitを使う
Chapter13 CoreDataを使う
Chapter14 Advanced SwiftUI

 

全14章。結構分厚い本です。

 

少し古いが役に立つ!

まず1番に大事なこととして、この本は少し古い本になります。出版日は2019年12月30日です。

WWDC 19で発表された SwiftUI ですが、2021年8月現在既に、WWDC 20, WWDC 21を終えています。とても新しい技術なので、この2回の発表で既にSwiftUIは大きく成長してしまっています。

本書は発表当時のSwiftUIについてなので、読んでいても、既にdeprecatedとなってしまっていたり、変わってしまっている部分が多くありました。

 

では、この本はもう古いから役に立たないのか?と言われればNoです!

というのも実際に用いることができるのは、WWDC20で発表された機能はiOS14から、WWDC21で発表された機能はiOS15からのものがほとんどだからです。例えば WWDC20で発表された LaszyVGrid は、iOS14からしか使うことはできません。

実際のシェア数を見てみると、iOS13も切っちゃって良いのではって気もしますが、それでもまだまだ、iOS13が切れないアプリは多いと思います。

そのため、この本も知識としては決して新しいのものではないですが、iOS13からの対応が必要な人にとってはとても役に立つ本じゃないかなと思います。

 

主に変わってしまっている部分として気づいたところを幾つかあげたいと思います。

UISceneDelegate について

Xcode11からライフサイクルが変わり、これまでの AppDelegate.swift にプラスして、 SceneDelegate.swift というファイルが作られるようになりました。このことについても本書は触れられています。

ですが、Xcode12 からは、以下のように Life Cycle の選択をできるようになりました。

このとき、SwiftUI App を選択すると、SceneDelegate.swift も AppDelegate.swift も生成されません。

代わりにプロダクト名App.swift というファイルが作られます。


//
//  HelloSwiftUIApp.swift
//  HelloSwiftUI
//
//  Created by Reo on 2021/06/27.
//

import SwiftUI

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

選択可能なので、もし本書通りにする場合には UIKit App Delegate を選択する必要があります。

 

CoreData の書き方

本書の13章に「CoreDataを使う」という章がありますが、上記のライフサイクルの変更のために CoreData の書き方も変わっています。UIKit App Delegate を選択した場合には本書通りに進めることができました。

また、SceneDelegate がない場合はどういう書き方になるのかについては、Life Cycle を SwiftUI App にして、Use Core Data をチェックしてプロジェクトを作成することで確認することができます。

これが、かなり変わってるんですよね。

本書だとこれまでの UIKit 通りのものを SwiftUI  に流用する感じの印象なんですが、SwiftUI  App の場合だと PersistenceController っていうものが生成されます。


import CoreData

struct PersistenceController {
    static let shared = PersistenceController()

    static var preview: PersistenceController = {
        let result = PersistenceController(inMemory: true)
        let viewContext = result.container.viewContext
        for _ in 0..<10 {
            let newItem = Item(context: viewContext)
            newItem.timestamp = Date()
        }
        do {
            try viewContext.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
        return result
    }()

    let container: NSPersistentContainer

    init(inMemory: Bool = false) {
        container = NSPersistentContainer(name: "HelloSwiftUI_CoreData")
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // Replace this implementation with code to handle the error appropriately.
                // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.

                /*
                Typical reasons for an error here include:
                * The parent directory does not exist, cannot be created, or disallows writing.
                * The persistent store is not accessible, due to permissions or data protection when the device is locked.
                * The device is out of space.
                * The store could not be migrated to the current model version.
                Check the error message to determine what the actual problem was.
                */
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
    }
}

Xcode11 -> Xcode12 でめちゃくちゃ変わっています。ContentView の記述も全然違いますので、ぜひ確認してみてください。

テンプレートの選択

こちらも13章の「CoreDataを使う」という部分になります。

テンプレートに「Master-Detail App」を選択しましょうと書かれていますが、これは Xcode12にて消え去ってしまっています。現在は 「App」という選択のみがあります。

現在手持ちにXcode11系がないので確認できませんが、「Master-Detail App」で生成されるコードが何かわからないままに説明されるので、そこが結構大変ではありました。

でもその章にコード自体は全部書いてあったので、なんとかはなります。

 

その他

functionBuilder が resultBuilder にリネームされています。リネームってより、functionBuilder が仮起きだったのかな?って感じですが。

 

本書の感想

ようやく感想です。

本書は、各章で Viewや機能の説明 + タピオカ屋さんのサンプルアプリの作成をする形でした。

ターゲットは、

  • Swift プログラミングの基礎は理解している人
  • UIKit によるアプリケーション開発の経験者

となっています。

基本的には 各Viewの説明、関数の説明、サンプルが日本語で読めるよ!というメリットがあります。

Apple の SwiftUI Tutorial は英語なので、やっぱりそこまで得意じゃないマンとしては読むのが大変になるのと、英語がちゃんと読めずに間違って理解する可能性もあるので、やっぱりこうして日本語に書き起こしてくれるだけでも有り難いですね。

そして、終わってから初めてチュートリアル見てみたんだけれど、ホーム画面なんかほぼほぼ一緒ですね!まぁそう…そうよね…。

 

ちなみに本書のサンプルアプリは以下のようなものになります。

このタピオカの絵、パスで書いてるので、トッピングの選択するとちゃんと変わるのでかわいいです。

ただこのタピオカのアプリに関しては、重要なところだけかいつまんで説明されているので、0から全部を作り上げる形ではないんですよね。各章ごとにサンプルがあり、そこにプラスして行く形になります。必要なものが9割ある状態で、プラス1の部分を書く感じです。

なので、0から全部作ったぞー!っていう達成感はなかったですね。ページの都合上しょうがないことではあると思いますが…。

 

個人的には、SwiftUI全く関係ないんですが UndoManager ってのがあるんだ!ってのを初めて知って面白かったです。

こういう新しいことを知れるので、やっぱり本は楽しいですね。読みやすかったです。

 

SwiftUIの感想

とりあえず一読して、半分以上は実際にコードを書いて動かしてみたので、SwiftUI わかった気がする!という状態です。

実際に書いてみて、感じた良かったところと微妙だなと思ったところを書いてみたいなと思います。

よかったところ

  • プレビュー機能はやっぱりいい!
  • Binding はらくちん!

フレームをセルの大きさにできたり、ロケール変更してローカライズ確認したり、複数端末を並べたり、とにかくプレビュー機能が最高に便利ですね!!

あと State とか Binding に関してもそんなに難しくはなくていい感じです。これは RxSwift 経験者だからなのかな。

あとかなり疎にはなるのかな?と思うので、普通に使っていても CocoaMVC みたいに FatViewController になっちゃうことは少ないのかなーと思いました。まぁ使い手の腕次第にはなってくると思いますが…

 

微妙なところ

  • ネストが深すぎて辛い
  • たまに怪しい挙動をする
  • modifier の設定順で表示が変わってしまうのでかなり難しい

とにかくネストが深いのがマジで辛いです。HTMLをやっている気分になっているというか…

ねすとつらい

これもサンプルのひとつなんですが、もうこれだけでつらくない?画面を等分にしてなんてやってんらんないくらい…。

括弧も多いから本当に写経しててもどこに次繋げればいいんだっていうのがわかりづらくてつらかったです。

 

あと普通に難しいです。以下の画像のプラスとマイナスのボタンをそろえたいだけなのに、どうしていいかわからなくなる…

paddingを調整すれば良いのか?いや、frameに変えればいいだけかな… で frame を書き足してみるけれど、書く順番によって全然違う結果になるし…。backgroundの設定より前に書きましょうねっていうこの地味に辛い感じ…

慣れればどうってことないのかもしれないけれど、結構慣れるまで苦労しそうだなと感じました。

 

とにかく一読する間に大分慣れてはきたけれど、それでも結構想像よりかなり苦戦しそうな印象です。SwiftUI で作りました!っていうアプリを入れてみたらもうボロッボロだったのをみてしまって、それ以来怖いです。でも、なんとなくそうなるのもわかった感じ。。。

でもあとは実践あるのみですかね。本書のおかげで一通りなぞることはできたと思います。iOS13時点までは。その先が結構進んじゃってるので、少しずつでも学んで行きたいと思います。

 

おわりに

前回のブログ投稿が3月ということで、少しだけ近況です。

6月から初めてまともに業務委託を始めて、現在はフルタイムでパキパキ働いています。なんと、大手です。今までの酷い酷い経歴でも、今後はもう困らないくらいんじゃないかなって思える…働かせてくれてありがとう…

ワクチンも2回打たせてもらえて、残業もなくて、ぬくぬくとiOSアプリを作っています。

今回こうしてSwiftUIの勉強をちゃんとしようと思ったのも、業務で SwiftUI 移行を目標にしていることを聞いたからでした。それに向けての作業をしているので、SwiftUI について知っておかないとなと思い、本書を読むに至りました。

 

今はお盆休みなのでどうにか読むことができたんですが、やっぱり働きながら活動するって個人的にはかなり厳しいですね。何かしなきゃっていう焦りだけがずっとあって、でも動けなくて。普通ならちゃんと働いているからそれで良いはずなのに、ずっと足踏みしているようなそんな気持ちです。

とりあえずニートをしすぎて人にお金借りているレベルの最低な人間なので、それを返して、ある程度生きていけるくらいの生活費を稼げたら、本気出して個人の方に戻って来たいなと思っています。

でも、両立できるのが一番なので、どうにか働きながらもできることをやっていきたいな。

 

それではでは。

Book
コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。