paranitips

Never stop learning! がモットーのゆるふわエンジニアブログ

swiftを一から勉強してTODOアプリをつくるまでの過程

仕事でしばらくwebで活動していたのですが、フリーランスになったことだし、アプリ開発をまた再開しようと思い、swiftを勉強してみることにしました。

また、今回swiftを勉強するにあたり、その過程もメモしていきました。
学習の過程って意外と忘れがちですよね 😪

最終成果物はgithubにおいてます 😃
paranishian/iOSToDoApp: iOS TODO app using Realm

まずはswiftの言語仕様を理解する

iOSアプリを開発していたのはObjective-C全盛期?の4年前くらいなので、swift自体初めて触るわけで、、、まずはswiftの言語仕様をおおまかに理解するために、公式docに目を通しました。

↓こちらはswift4には追いついていませんでしたが、英語での理解不足を補うために一緒に読みました。感謝 🙏

ちょっと手元で試してみたい、ってときはpaizaを使いました。web上で手軽に試せて便利 😆

ブラウザでプログラミング・実行ができる「オンライン実行環境」| paiza.IO

ここで理解したこと

  • クロージャーの構文
  • defer
  • where
  • try?
  • ??
  • error handling
  • tuple
  • guard/else
  • stride

このときの印象は、、、「swiftめっちゃ引数わかりにくい...!!! 😇 」 どれがkey??どれがvalue??どれが返却値??みたいな 🤣

TODOアプリをつくる

swiftの仕様はおおまかに理解できたので、なにかアプリをつくって学習するのが手っ取り早いなーと思い、仕様で迷うことが少なそうなTODOアプリを作ることにしました。
データを扱う上で、CoreDataかRealmかで迷いましたが、「使ったことがなくて触ってみたかった」という理由でRealmを採用しました。

まずはRealmのリファレンス通りにつくっていく

ありがたいことにRealmにTODOアプリのdocがあったのでそこを見ながら進めました。

ライブラリ管理ツールを決める

CocoaPodsかCarthageか迷いましたが、ライブラリ数ではまだまだCocoaPodsが優勢、との話を友人から聞いたのでCocoaPodsにしました。

ちょっとした変更と修正

Realmのdocではサーバ同期ありきで書かれているのですが、今回はローカルだけで使いたかったのでsetup部分を少し変更しました。
また、ドキュメントどおりだとどうしてもうまくいかない部分があったのでゴニョゴニョしました。 (if realm.objects(TaskList.self).count == 0の部分)

func setupRealm() {
    let config = Realm.Configuration(schemaVersion: 1)
    self.realm = try! Realm(configuration: config)
    func updateList() {
        // まだTaskListが存在しない場合は追加する
        if realm.objects(TaskList.self).count == 0 {
            try! realm.write {
                realm.add(TaskList())
            }
        }
        if let list = realm.objects(TaskList.self).first {
            items = list.items
        }
        tableView.reloadData()
    }
    updateList()
    // Notify us when Realm changes
    self.notificationToken = self.realm.observe { _,_ in
        updateList()
    }
}

ってなかんじでTODOアプリが完成! 🎉
(ほぼサンプルのままだけど)

paranishian/iOSToDoApp: iOS TODO app using Realm

とりあえず動くものが完成したので、あとは

  • TODOアプリに機能追加
  • 別のアプリつくる
  • fastlaneでbuild自動化

あたりかな〜。

それではまた 👋