本気ではじめるiPhoneアプリ作り(ヤフー黒帯シリーズ)を読んだ
February 23, 2019
ここでも書いた通り、去年個人アプリをAppStoreに公開したのだが、我流で進めてきたので、一旦、基本に立ち返ってみようと思い、積読してた本気ではじめるiPhoneアプリ作り(ヤフー黒帯シリーズ)
を読んでみた。
結構前に買った本だったのでXcode8.x, Swift3.xを元にして書いてある。今、買う人がいればXcode10.x対応された版が出ているのでこちらがオススメ。
サンプルコードを試す時に利用した環境
Xcode10.1
Swift4.2
Swift3との差分は少しあったが、自分の場合は、ググったり、XcodeのFix-itで特に問題なかった。
各章で印象に残ったところ
Chapter1 アプリ開発の準備
実機でテストする時の観点(P.30)
今までは、なんとなく下の事を確認していたが、こうやって言語化されると、しっかり意識がそこに向いて良い。
- 片手で操作ができるか?
- カクカクしていないか?
- 全ての機能が動作するか?
- リークしていないか?
Chapter2 Swiftプログラミングの基本
if letでアンラップの変数名は同じにする(P.59)
アンラップ処理したが、アンラップ前の変数を使ってしまうのを防ぐため。
自分は無意識で使っていたが、なぜ?がわかってスッキリした。
アンラップ前の変数を使ってしまった場合
var v: String?
v = "hello"
if let unrappedV = v {
print(v)
}
関数の引数を別名にする(P.62)
呼び出し元で理解しやすい変数名にすると、長くなりがちなので、関数内部で使う変数名は違う名前にすることができる。個人的には、変数名が長くなりがちなので、この仕様はありがたい。
func showScore(baseballScore score: Int) {
print("野球の点数は\(score)点")
}
関数の引数を省略する(P.63)
同じワードを繰り返すと、冗長に見える場合があるので、省略することができる。個人的には、ワードが重複するのは、冗長に感じるのでこの形を使いたい。
func addScore(score: Int) {
}
addScore(score: 10)
---
func addScore(_ score: Int) {
}
addScore(10)
Chapter4 アプリの基本をマスターしよう
Interface BuilderでInitial View Controllerをドラッグ&ドロップで変更できる(P.182)
知らなかった。Is Initial View Controller
をチマチマいじっていたので、良い気づきになった。
Unwind Segue(P.186)
名前だけ知ってて使った事なかった。Exitってなんだろ?って謎が解けた。
Auto LayoutとTrait Variationsは別々の機能(P.193)
Auto LayoutとTrait Variationsは別々の機能です。Auto Layoutは各部品に対して設定した制約(constraints)に従って部品のサイズや位置を変更する機能で、Trait Variationsは端末の向きとサイズの組み合わせで部品のレイアウト方法を決定する機能です。
まだこの辺の機能がうまく理解できていない。別々の機能だが、いろいろなデバイスに対応するためには、2つの機能を利用することがほとんど。2つ併せてAuto Layoutと呼ばれる事が多い。ということは理解できた。
Resolve Auto Layout Issues(P.201)
知らなかった。どういう制約を追加すれば良いかを、悩んだ時に使うのは良いと感じた。が、冗長な制約も追加されるときがあったので、あくまで参考にする。が良いと思った。
複数の部品同士の制約を「control」キーを押してドラッグ&ドロップで追加する(P.208)
今までは2つの部品を選択して設定、という方法で設定していた。Interface Builderを使うのであれば、こちらの方が直感的でわかりやすいと思ったので、こちらを使っていきたい。
Chapter5 永続的なデータを扱う
iOSデバイスデータの保存先(P.211)
iTunesでバックアップされる、されない。は考えた事がなかったので勉強になった。また、Documents/Inbox
は何のためにあるのか?と思っていたが、データの受け渡しのためと知って、理解できた。
UserDefaultsの仕組み(P.212)
理解がふわっとしていたが、仕組みを知る事で、どういう時に使うか?どんなトラブルが起き得るか?を理解する事ができた。
-
特徴
- メモリ上でやり取りするので、高速に読み書きできる。
- 書き込みはiOSのタイミングで、メモリからファイルに反映される。そのため、反映前にクラッシュするとデータが損失する。
- 明示的にファイルに反映させる事ができるが、処理に時間がかかるので注意。
- アプリ起動時にデータをメモリに載せるので、巨大なデータを保存させていると起動が遅くなる。
UITableViewCellで気をつける事(P.264)
DateFormatter, NumberFormatterの生成はコストが高い。というのは勉強になった。普段、都度生成するということをやらなかったので、ハマったことはないが、たまたまなだけなので、コストが高い処理を知れた事は勉強になった。
透明なビューを多用しているか?は、個人レベルだとそこまで使いまくることはないが、業務で関わる場合は、覚えておきたいポイントだと感じた。
Chapter6 サウンドとアニメーションの処理
フレームワークを使うとアプリのサイズは大きくなるか?(P.268)
ならない。共有ダイナミックライブラリとして、iPhoneの実機に組み込まれているから。これを知ったことで、OSのバージョンごとに使えるAPIが限定される理由が理解できた。
なぜ明示的にフレームワークをimportするのか?(P.269)
暗黙的に全てimportしてしまうと、import先の存在チェックのため、アプリのビルド時間が長くなる。また、アプリの起動時も、全てのフレームワークを読み込んでしまうと、アプリの起動時間が遅くなる。そのため、明示的にフレームワークをimportする。
Core Animationのアニメーションの仕組み(P.279)
Core Animationのアニメーションは、ビューを一度ビットマップ画像に変換し、ビットマップ画像を扱うことができるグラフィックス処理用のハードウェアでアニメーションの描画処理を行っています。
layerプロパティがビットマップ画像として表示を保持していて、それを変化させる(=アニメーション)という仕組みだった事がわかって、かなりスッキリした。
Chapter7 通信できるアプリを作ろう
Playgroundで非同期処理を使うために(P.338)
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
新しいAPIのテストをするときなどにPlaygroundでやると効率が上がりそう。cocoapods, carthageのライブラリを利用したい時にどうやるかがわかっていないので、そこも出来るようにしたい。
キュー、スレッドの話(P.339)
イベントを検知すると、イベントキューに登録される。スレッドがキューからイベントを取り出して処理する。UI操作や更新処理を行うためのイベントキューをメインキュー
と呼び、メインキューのイベントを処理するスレッドをメインスレッド
と呼ぶ。メインスレッドで時間のかかる処理をすると、フリーズしているように見えてしまう。時間のかかる処理はワーカースレッド
で行う。ワーカースレッドを使うと、並行で実行できるが、UI更新処理ができないため、ワーカースレッドの処理中の必要なタイミングで、メインキューにUI更新のイベントをセットする。
最後に
最後まで読んでみて、全く知らない!ということは少なかった。しかし、表面的な理解だった箇所は多かったので、一歩踏み込んだ理解ができた。iOS開発でよく使いそうな箇所をチュートリアルにしてあるので、そこから派生して色々と学べるのは、この本の良いところだなと感じた。技術書は写経まででブログにまとめる事がほとんどなかったが、理解を深める、記憶に定着させる、という面に効果があるな。と感じたので、これからも続けていきたい。次は↓のどちらかをやる予定。