これからつくる iPhone アプリ開発入門 Swift ではじめるプラグラミングの第一歩

投稿日: カテゴリー

これからつくる iPhone アプリ開発入門 Swift ではじめるプラグラミングの第一歩

藤 治仁、徳弘 佑衣、小林 加奈子、小林 由憲著
SBクリエイティブ / 2680円+税 / 2016
イラストレーション: 加納徳博 / ブックデザイン: 新井大輔

プログラム初心者を対象にした iPhone アプリ開発の入門書です。

メッセージは「とにかく体験しよう」。

じゃんけんゲームを作り、楽器アプリ、マップアプリ、タイマーアプリ、SNS 投稿するカメラアプリ、Web ページと連携とこなしていきます。お菓子検索アプリなんてめちゃくちゃ凄いわ。…って、実際は「お菓子の虜」の鳥山さんが凄いのだが :-) シミュレータで遊ぶだけでなく、実機で動かして人に威張ると楽しそうです。

タイトルからすると Swift の入門書にも見えますが、実際には Xcode の操作に相当のページ数を割き、絶対に道を踏み外させまいとする筆者らの強い意志を感じます。

背景には勉強会でのフィードバックがあるようで、途中の読者への注意がとても具体的で、幅広いのが特に良いです。iPhone がロックされてて転送できないとか、関連付けの Connection がグレーなのに選択できるのかよ!? とか、[Edit] と [Editor] 違うのかよ!? とか、絶対勉強会で出たトラブルだろうなぁと思いますもんね。「Fix Misplacement」の説明だって真面目に繰り返します。エライ!

割り切り方も上手です。Xcode の説明を英語第一で使うという方針は正しいと思うし、その分、恐ろしいまでに日本語の説明が入るので安心させるし、iOS10 の ATS やアプリの公開手順は公式サイトでのサポートとして(恐らく)今後の更新に備えています。delegate や protocol も雰囲気だけですが、感じはつかめるでしょう。

ここまで読んでも不安な初心者は、以下で目次や冒頭の50ページ分が無料公開されているので参考にしてください。この調子で最後まで行きますし、何度も同じ内容が繰り返されたり、ページ数指定で過去のページが復習用に案内されます。

https://swiftbg.github.io/swiftbook/about/

ところで著者らは通常業務の合間に執筆したようでスクリーンショットの時間が泣かせます。

4:06 AM (P.118)
6:46 AM -> 2:03 AM (P.156)
1:22 AM (P.190)

応用編テキストはまだ準備中みたいなので、あとしばらくがんばってね \(^o^)/

P.S. 表紙とイラストがかわいい。これもポイント高いな。

以下は校正ミスとコメント

P.ix 4.3.4 [Indentifier] -> [Identifier]
P.xii (2)プログラムソースコード内
soundPlayer(&backmusicPlayer ,path:guiterPath, …)
-> soundPlayer(&backmusicPlayer, path: guiterPath, …) カンマ位置、path: の次の空白。あと backumusic と guiter がごっちゃなのも気になる。そして guiter は guitar のミススペル。
P.16 Tips Apple すべてのサービスで -> Apple のすべての
P.21 図「プロジェクトテンプレートの選択」 [iOS] を赤で囲んでいるが説明がない。
P.37 2.2 Constrain -> Constraint Constrain は動詞。
P.41 下から L.2 最後の「}」(波括弧)上に … -> 最後の「}」(波括弧)の上まで (P.162 等の表現ですが、こちらのほうが分かりやすいと思います)
P.48 5.3 (3) 発生していのが -> いるのが
P.49 図「デバイスの選択」 P.43 では「iPhone 6」を選び、P.44 等ではそのような表示になっているが、iPhone 6s Plus」に戻っている。
P.50 図「アプリの完成イメージ」。章の冒頭なら「完成イメージ」だが、ここでは「アプリの実行画面」とかでは?
P.54 図「じゃんけんアプリの完成イメージ」キャプションが図の上。同様のミスが完成イメージでは続くが、もしかしたらこの部分は「表」で出来ているため上に来ている?
P.69 Constrain -> Constraint
P.71 Constrain -> Constraint
P.77 (3) Label更新がされた -> Labelが更新された
P.90 下の枠囲み内 1-3 画像を … -> 1-3 じゃんけん画像を … (P.95に従うと)
P.91 1-1 (3) 見えるようします -> 見えるようにします
P.100 関数 (Functions) -> 関数 (Function)
P.104 図のキャプションがない
P.121 1-2 (3)「enter」キーを実行して… -> 押して、あるいは P.36 他、同様タイプだけで検索されるのでは
P.134 図「Preview 複数デバイス表示画面」の iPhone SE でギターの画像が切れていて、あまり「バランスよく表示できている」とは思わないのだけど…? 何か私が誤解している?
P.136 「できるようになること」 の「プログラムにひも付けます」-> P.163 には「本書では「関連付け」で統一します。」とある。
P.136 1節 つないだ -> 関連付けた
P.138 いきなり「フレームワーク」が登場した感。索引になし。P.164 に説明あり。
P.138 ここで cymbalPlayer をインスタンス化して、再度 P.141 の cymbal メソッド内でインスタンス化すると P.138 は無駄では? 例外処理のための制限か? バックミュージックがループで非同期に鳴らし続けるために必要? シンバルやギターも非同期処理されるから必要?
P.142 「のちほど、シンバルの音を無事に鳴らすことができたあとに」すぐ次のページでやります :-)
P.144 Memo。デバッグエリアの表示、非表示は P.143 のもの。
P.152 最初のコード例。cymbalPlayer.play() でインデントミス
P.152 2番目のコード例。soundPlayer(&cymbalPlayer ,path:cymbalPath, …)
-> soundPlayer(&cymbalPlayer, path: cymbalPath, …) カンマ位置、path: の次の空白
P.152 参照渡しして戻ってきた cymbalPlay を使っているように見えないのだが? ここは値渡しで十分に見えるし、そもそも引数で渡す必要もなく、soundPlayer メソッド内のローカル変数でいいのでは? バックミュージックはそうはいかないかもしれないが…。
P.153 soundPlayer(&guitarPlayer ,path:guitarPath, …)
-> soundPlayer(&guitarPlayer, path: guitarPath, …) カンマ位置、path: の次の空白
P.153 soundPlayer(&backmusicPlayer ,path:backmusicPath, …)
-> soundPlayer(&backmusicPlayer, path: backmusicPath, …) カンマ位置、path: の次の空白
P.156 図「マップアプリの完成メージ」のキャプションが図の上
P.159 Memo ピンチイン、ピンチアウト。説明がないのでちょっと唐突。地図だから分かる?
P.163 図「Map Kit View 関連付け操作画面(2)」 赤枠がずれている
P.167 下のコード例にキャプションがない。上のコード例と行番号、コメントが違う。
P.169 P.139によれば searchKeyword は「変数」でなく「定数」では? 変更不可の「変数」でいい気もするけど。
P.169 最後のコラム -> 最後から2番めのコラム
P.170 図「キーワードから緯度経度取得するソースコード」-> 緯度経度を取得する
P.170 図「キーワードから緯度経度取得するソースコード」赤枠は一つ上のコメント「// CLGeocoderインスタンスを取得(5)」も含めて良いのでは?
P.171 いきなり「配列」が登場した感。P.242に説明あり。
P.175 図「delegate の仕組み」「委譲」が出てくるが、これが delegate の訳語、という説明がない
P.176 L.5 UITextFieldクラスには、-> クラスでは? ここの意味はよく分からない。UITextField クラス内部の話をしているのか?
P.176 L.7 textFieldShouldReturn メソッドの定義 -> 宣言? 定義というと実装に聞こえるが…。
P.178 図「マップアプリのカスタマイズ完成イメージ」キャプションが図の上
P.180 2-2 (2) 左下部 -> 右下部
P.182 2-3 (2) 左下部 -> 右下部
P.184 各プロパティの定義で、表のキャプションがない
P.184 コラム。本書で使用する型は紹介しても良いのでは? P.97 の UInt32 の説明。arc4random_uniform 関数の戻りを受けるためとか。P.278 の Any。
P.190 図「タイマーアプリの完成イメージ」のキャプションが図の上
P.192 「[Main:storyboard] を Navigation Controller に変更しよう」このタイトルと冒頭の数行はよく分かりませんでした。

以下、私の思考
(1) Document Outline に Navigation Controller Scene を追加することで、[Main:storyboard] が Navigation Controller に変わる、ということなのか? … P.195 の手順で「まだ [Main:storyboard] いるじゃん」と思った。
(2) P.192 「最初に作成される ViewController は、デフォルトで ViewController クラスになっています。」が意味不明で考えた。「最初に作成される ViewController」が何を指すのか? タイマー画面のことかな。
(3) P.194 「プロジェクト作成後の [Main.storyboard」は、ViewController クラスをデフォルトで利用しています。」が意味不明で考えた。特に「プロジェクト作成後の」の意味が取れなかった。「これまで作成してきたプロジェクトにおいて [Main.storyboard」は、最初にデフォルトで作成される ViewController クラスをそのまま利用してきました。」という意味を含むのかな。
(4) ここまで Storyboard の意味、Document Controller の意味、Scene の意味、を説明していないので、ちょっとこのレッスンの説明が辛いのかな? 設定画面用の追加の View Controller Scene を追加するとか。

で、今はこういうことかと思っています。

これまで [Main:storyboard] は Document Controller 内に1つだけある View Controller Scene の View Controller をデフォルトで使ってきた。
ここに「Navigation Controller」を Embed In し、「Navigation Controller」->「View Controller」とすることで、 [Main:storyboard] はまず Navigation Controller Scene の Navigation Controller を使用する。

というわけでタイトルの「[Main:storyboard] を Navigation Controller に変更しよう」は、「[Main:storyboard] のコントローラを View Controller から Navigation Controller に変更しよう」として、仕組みを説明してはいかがかと。
まったく誤解しているのかもしれないけど…。

P.195 3-1 (4) 「enter」を実行して …  -> 押して、あるいは不要。P.121 1-2 (3) コメント参照
P.205 4-4 (1) 「enter」を実行を実行することで …  -> 押して、あるいは不要。P.121 1-2 (3) コメント参照
P.221 11-1 (1) [Assistant editor] ツールバーの -> ツールバーの アイコン画像は後ろの [Assistant editor] の直前に移動。
P.221 11-1 (3) ひも付ける -> 関連付ける P.163参照
P.225 図「コードの出力」「追加」は不要
P.234 6-1 内の下からL.2 stopButtonAction -> startButtonAction
P.235 Tips 英語な苦手な方も -> 英語が
P.235 表「指定可能な引数」第一引数 t1 -> ti
P.237 「コードが冗長になっている」というのを、覚えているでしょうか? -> P.150 で「冗長」や「冗長性」の語は使っていない
P.238 override func viewDidAppear(_ animated: Bool) { の文法的な説明がない。わざとかな?
P.241 図「PickerView の宣言」の SettingViewController.swift を選択する説明が本文にない
P.242 節 6 最後の行。仕方ない気もするけどサンプルは let
P.246 終了値を含めない回数(5回) -> 説明は分かりますが、回数としては6回ですよね…。
P.248 節 8 decisionButtonAction に実装することは触れても良いのでは?
P.253 「5 カスタマイズしてみよう」。他のレッスンは「カスタマイズ編」で統一されている。
P.254 図「timerInterrupt の修正」let alertController = … 行の右端が切れている。
P.258 図「カメラアプリの完成イメージ」。キャプションが図の上
P.259 図「カメラアプリの完成イメージ」。キャプションが図の上
P.264 (2) 「カメラを起動する」Button パーツは、下に配置します。-> Button パーツの下に配置します。または、「SNS に投稿する」Button パーツは
P.272 Tips 内の表にキャプションがない
P.275 2-3 cameraButtonAction に実装することは触れても良いのでは?
P.275 2-3 「でカメラが利用できるかを判定できます。」が2行続くと、「.camera」を渡している意味が分からないので、1行目はもう少し汎用的な説明、たとえば「カメラやフォトライブラリーが利用できるかを判定できます。ここでは引数に…」等に変えたほうが良いのでは?
P.275 3節 cameraButtonAction に実装することは触れても良いのでは?
P.279 5節 SNSButtonAction に実装することは触れても良いのでは?
P.280 L.1 … 5-3 マップ検索アプリを作ろう」(P.155) -> … 5-3 マップ検索アプリを作っていこう」(P.165)
P.280 表のキャプションがない
P.281 …「Hello Swift!」(P.35) と表示してみよう」 -> …「Hello Swift!」と表示してみよう」(P.35)
P.282 図と表。どちらもキャプションがない。
P.283 図「カメラアプリのカスタマイズ完成イメージ」のキャプションが図の上
P.283 図「カメラアプリのカスタマイズ完成イメージ」 フォトストリーム選択画面 -> フォトライブラリー選択画面
P.286 表。どちらもキャプションがない。
P.292 図「カメラアプリの完成イメージ」のキャプションが図の上。
P.315 3節 closeButtonAction に実装することは触れても良いのでは?
P.316 図と表。どちらもキャプションがない。
P.317 4節 effectButtonAction に実装することは触れても良いのでは?
P.321 図「画像をシェアするソースコード」 let controller = … の行の右端が切れている
P.321 5節 shareButtonAction に実装することは触れても良いのでは?
P.323 図「カメラアプリのカスタマイズ完成イメージ」のキャプションが図の上
P.325 2-4 effectButtonAction を編集することは触れても良いのでは?
P.330 図「お菓子検索アプリの完成イメージ」のキャプションが図の上
P.344 [Indentifier] -> [Identifier]  見出し含め 5か所
P.359 4-3 ATS。うーん、鳥山さんにサイトを HTTPS 化してもらい、ATS に触れない方向でも良かったのでは? まぁ実際の実装ではきっと困るからありがたい説明だけど。
P.362 1-1 どのファイルに追加するかを触れても良いのでは?
P.363 下の図。キャプションがない。「タプルを配列として追加」の下の okashiList = が3行続くところが、うーん、わからない。okashiList[0] = …、okashiList[1] = …、okashiList[2] = … ってことか? その下の「タプルを配列に格納」もわからない。okashiList[1] = (…) かな?
P.370 cell.imageView? でセルの中に画像が表示出来ることが分かるけど、この説明は欲しい。P.340 でセル内に画像を表示できることは分かるけど、たとえば P.344 で「Style」に「Basic」を指定した時、何が出来るか説明してもよいと思う。
P.373 図「カスタマイズ後の完成イメージ」のキャプションが図の上
P.374 SFSafariViewController の delegate の通知先を tableView 同様、あるいは、これまでのレッスン同様 viewdidLoad() で行わず、cell 選択の delegate メソッド内で実施する理由は?

索引
アンラップ 171、256 追加
オプショナル変数 171、256 追加
変数 97 -> 96
メソッド 86
配列 243 -> 242、362

P.384 掲載許可の快諾 -> 掲載許可を快諾

コンセプト的な話ですが「2日」ということに何か意味があるのかな? 前半、後半で分けたかった? 最初はタイトルに「2日で覚える」とかあった?

コメントを残す

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