『たのしいSwiftプログラミング』正誤表 | HMDT Blog

『たのしいSwiftプログラミング』正誤表


『たのしいSwiftプログラミング』ですが、正誤表準備できました。

正誤表/サポート:たのしいSwiftプログラミング[iOS 8&Xcode 6対応]

普通の誤植やミスと、Xcode 6.1というかiOS 8.1への対応を記述してあります。iOS 8.1になったとき、多くのCocoa APIのオプショナル型が変更されたため、こういった事態になってしまっています。

ビルド時にエラーが出た場合は、こちらを参照してください。

    • Ainest
    • 2014年 11月5日

    こんにちは、私はアプリ開発初心者で、
    『たのしいSwiftプログラミング』に従ってやっていたのですが、ちょっとよくわからないことが起きたので質問させてください。

    4-4-4 「自動レイアウトを設定しよう!」のボタンの自動レイアウトについて、
    p148の図に従ってボタンの大きさを大きくすると、Horizontal Center in Containerにチェックを入れていても、配置が中央とならず乱れてしまい、レイアウトを完成することができません。
    その際には
    Misplaced View
    Frame for “~~” will be different at run time
    というエラーメッセージ(?)もでています。

    何もいじらずに取り出したボタンをそのまま置くと、うまくいくのですがなぜでしょうか?

    テキストフィールドについてもうまくいっています。
    (Ambiguous Layoutという警告のようなものは出てますが…)

    以上の事柄について、お教えいただけると幸いです。

      • mkino
      • 2014年 11月5日

      レイアウトは、気がつくと余計な設定がたくさんくっついていることがあるので、
      どうもうまくいかないと思ったら、一度削除してもう一回やり直してみてください。
      親になるビューや、隣にあるビューの影響を受けるとこともあるので、
      設定項目をよく確認してみてください。

      ビデオでも解説しているので、こちらも参考にしてください。
      https://www.youtube.com/watch?v=abbv0nwu1D0

        • Ainest
        • 2014年 11月6日

        ありがとうございます。
        どうやらボタンのサイズを変えようとすると失敗してしまうようです。
        ビデオではサイズを変えていなかったので、そちらで対処いたしました。

          • kitamura
          • 2014年 11月10日

          ありがとうございますって、解決していないと思いますよ。プログラムはちゃんと突き詰めていくことが大切ですよ。自分の経験上、あいまいにすると後で痛い目みますよ。実践の際に、結局同じことで悩むことになる。

          というか、著者さんの回答は、ちょっと適当すぎる。忙しいとは思いますがダメです。

          自分も試してみましたが、エラーは発生しませんでした。なので、エラーについてはわかりません。
          でも、自動レイアウトが効かないのは確認できました。
          ボタンのサイズを大きくした場合や、ボタンを初期配置位置が真ん中でないところに設定した場合に、そのあとAutoLayoutを設定して(Horizontal選択して、Add Constrains押下)、アウトラインビューからView Controllerを表示し、サイズインスペクタから縦横のサイズ変えても、自動でボタンの配置が変わらない。(でも、シミュレータを実行すると、ちゃんと変わっているっぽい)

          著者の提供しているビデオみましたが、わざとらしいぐらいに、最初から正しい位置にボタンとテキストを配置しているので、この現象が起きない。

          通常のやり方だと、この現象が起きる。これアップルのバグですかね。
          著者さん、何か情報をもっているなら教えてほしい。

            • Ainest
            • 2014年 11月10日

            >kitamuraさん
            問題を共有していただきありがとうございます。

            ご指摘の通り、解決しきっていないことは確かです。
            実践の際に悩むことになるということもその通りでしょう。

            ただ、私は初心者 (Xcodeを含む) で、書籍をまだ通読しておりません。
            ですので、まずは一通り進めていったほうが効率が良いかなと思ったのです。
            mikinoさんから頂いた「設定項目をよく確認してみてください」という指示についても、現時点 (5-2あたり) では変更を加えた項目以外を知りませんので、後々わかる可能性もあるかなと考えました。
            通読していないにも関わらず、質問しつづけるのも悪いですし、ましてやアップルのバグの可能性もあるのですから…

            以上のことと、ビデオのやり方が写真とは異なっていることから、私はビデオの方に従うことにしたという、そういう次第です。
            「設定を確認」すれば分かるであろうという指摘と、ビデオを見ることを考えていなかった私にビデオを紹介して下さったこと、さらにはお忙しい中返信していただいたこと、この3つの事柄にたいして感謝の言葉を述べたのです。

            エラーメッセージという表現は間違っていると思います。下調べせず、すいません。
            ナビゲーター領域のShow the issue navigatorと表示される!のボタンを押すと、表示されたものです。
            原因がわからないので、いろいろ押していたら出てきました。
            シミュレーターでは変更されるのですね。
            それについては試みていなかったので、貴重な情報を教えていただきありがとうございます。

            長文失礼いたしました。

    • kitamura
    • 2014年 11月5日

    決して間違いじゃないんですが、ちょっと気になったことを・・。
    P96の sheLikesMe = trueですが、直前に「もしもあの時勇気を出して声を・・」って書いているのに、彼女が好きだったらって、全く正反対のことかいていて、関西人だったら、「なんでやねん!結局他力本願かいな」ってつっこまれまっせ。w

    で、P98のelse ifを使う例ですが、こっちはちょっと直してほしいな〜と思いました。
    なにかというと、if, else if,elseを使うときって、条件には同じ変数に対する条件を書くのが基本と思うんです。これ、ほんとうにバグの原因になりやすいので。
    今回書かれているように、2つのまったく違うものを並列に並べるのであれば、
    ちゃんと改行すべきと思います。

    if()
    {
    else
    {
    if()
    {
    }
    else
    {
    }
    }

    • kitamura
    • 2014年 11月9日

    関数は func 関数名(引数名:引数型)->返り値と3章にありますが、
    P170 func tableView: UITableView, numberOfRowsInSection section: Int)-> Intっていうのはその形にそっていなくて意味がわからない。「numberOfRowsInSection section: Int」の部分が。はしょっていますよね、外部引数名宣言の説明。

    P171 のソースコード中のasも何の説明もないですし。

    P176 yearsの配列を追加していますが、ここで辞書を使わないと、一体どこで使うんですか?っていうぐらい使うべき箇所と思ったのですが。
    とにかくコードが適当すぎる。プログラム初心者がかくような、コードはやめてほしい。
    それとも順番が大切なんですか?P85で順番が大切なら、配列を併用することを考えるべきだと熱く語っていますが、、配列の併用というやり方を示してほしい。
    辞書に配列を併用するって、自分は意味がわからないです。自分なら、タプルの配列ですね。iPhones = [(“iPhone”, “2007”),…]

    他にも文の末尾にセミコロンがあったり、なかったり。間違っていないけど。

    前回指摘したelse ifの件もそうなんですが、手を抜いている感が半端ないです。あんなコード、プロならありえないです。

    不用意にコードを書くと、多くの読者が真似するので、手を抜かないでほしい。サンプルソースを重要視してほしい。
    村田さんから話し聞いていると思いますけど、自分、本書の間違いをかなり指摘しています。
    無駄にイライラしています・・・。小さいことでイライラする自分も自分ですが。
    早く第2版だしてください。
    こんな指摘くれるユーザ、かなりありがたくないですか?文句にしか聞こえないでしょうけど。
    余計なお世話ならいってください。二度としませんので。

      • kitamura
      • 2014年 11月11日

      メールをいただきましたが、せっかくなら、ここに書いていただければ、第三者がみれるのでいいと思いました。勝手に載せます。嫌であれば削除しちゃってください。
      自分はいただいた回答に対しては、納得はできませんでした。

      読者によっては不明瞭だったりとの回答でしたが、初心者であるなら、絶対に不明と思う箇所が多いです。不明と思わないなら、気づいていないか、気づいてハテナと思っても、とりあえず置いといて読み進めているだけだと思います(上のAinestさんのように)。理解できなくてもサンプル実行している間は全く問題ないので。問題が発生するのは、いざ自分のアプリを作り始めたときですね。(説明が抜けたというのが正解だと思いますので、反論しなくても数行の説明を追加してくれたらいいだけなんですが・・。それによって散漫な記述になるというの理由がわかりません。)

      >考えられるすべてのエラー処理や拡張性を含めることはできますが、
      当たり前のことですが、サンプルにそこまで期待する人はいません。
      ただ、そのコードはナイだろうということを指摘させてもらいました。
      UITableViewの説明がメインだけれども、別にここを辞書にしたからといって、散漫な記述になるとは全く思いません。
      仕事のコードとサンプルは違うって、そりゃそうですが、サンプルでも最低限の考えないといけないことはあると思いますよ。自分のローカルなら、ご自由にですけど、結構な数の人が読む本なので、そういう考え方は甘いと思います。
      結局どんなにでかいプログラムも、分解していけばサンプル程度の小さいプログラムになると思いますので、サンプルを軽視するのは、いただけません。

      ==================
      真摯なご意見ありがとうございます。
      本書を執筆する際の方針について、お伝えしたいと思います。

      本書は入門書を標榜しています。
      それぞれの章で、何らかのプログラミングトピックを解説しているのですが、
      そのターゲットが絞れており、かつ簡潔にまとまっていることが重要と考えています。

      ソースコードを提示するときに、
      考えられるすべてのエラー処理や拡張性を含めることはできますが、
      これをやるとターゲットが絞れず、散漫な記述になります。
      その結果、何も理解できない文章になる恐れがあります。

      仕事で記述するコードと、サンプルコードは、明らかに違うでしょう。
      なぜなら、前者が安定性と拡張性を重視するのに対して、
      後者は対象となるトピックを浮かび上がらせるのが目的だからです。
      目的が違うのであれば、記述は異なることになります。

      また、コードは常に仕様が与えられ、それに対して必要かつ十分なものを
      記述すべきでしょう。
      たとえば、UITableViewCellクラスは、テキストを表示するためのラベルは、
      titleLabelとdetailLabelの2つしか持たない仕様です。
      であれば、UITableViewCellの動作の説明が目的であれば、
      データとして2種類の配列を持つのは必要にして十分です。
      2つより増えることがないのですから。
      辞書型はtoo muchでしょう。

      無論、話のトピックがプロトタイプセルや、UITableViewCellのサブクラスを作ることであれば、
      辞書型なり、タプルなり、構造体なり、クラスなりのデータを持つことになるでしょう。
      仕様が変われば、データも変わることになります。
      または、様々な種類のデータを提起して、それに適切なデータ型を議論する、
      という話も面白いでしょう。
      ですが、それはそういう話のトピックが上がっているときです。

      いずれにしても、それぞれの章には解説するトピックがあり、
      それを伝えるためにコードなり文章なりを目的を持って記述していることをご理解ください。
      —-

      執筆方針はすなわち編集方針とも重なることでもありますが、
      入門書、また書籍という性質上、全てを記述するのではなく、限られたことを記述する、という方針を採ることはよくあります。
      これが、読者によっては物足りなさや不明瞭さを感じさせてしまうこともあることは理解しておるつもりです。
      本書が北村さまにご不満を多く与えてしまったこと、心苦しく思っておりますが、
      書籍の内容につきましては意図を持って構成していることをご理解いただければ幸いです。
      一方、誤植が多いことは、これは私の責任です。誠に申し訳ありません
      ==================

        • kitamura
        • 2014年 11月11日

        ちなみに説明が抜けているものに関しては、素直に説明を追加してくださればいいだけのことなんですけどね。数行でキーワードだけでも、さらっと説明するだけでいいんですよ。あとはググればいいので。
        その数行の説明がないから、疑問符だらけになるんですよ。

          • kitamura
          • 2014年 11月11日

          いろいろとイライラして指摘してしまったのは、すみません。
          納得いかないところを指摘たくさんしましたが、語り口調でさくさくと読み進められるし、浮動小数点のトピックもためになったし(そうだったのかと新しい発見)、いろいろと満足している点は多いです。

          いまさらながらに、褒めてますが、村田さんとのメールの最初にもその旨は、真っ先に書いています。

          だからこそ、惜しいんですよ。自分のした指摘直してもらえたら、絶対にわかりやすくなると思いますよ。自分としては、かなり初心者目線で指摘しているつもりです。

    • Ainest
    • 2014年 11月11日

    おそらくまだ指摘されてなさそうなので、

    p173 の本文の行数が、22行目 → 12行目、27行 → 17行だと思われます。

    コードが長くなると初心者は、本文でどこのことを書いているのかわかりづらくなると思うので、行番号をコードに書いてあると助かると思います。
    私はXcodeで表示させましたが、コメントなどでズレると分からなくなる時もあります。

      • kitamura
      • 2014年 11月11日

      自分もそれは思いましたね。説明には行番号かいてあるのに、コードには行番号がかいていないので。自分は行番号とソースコードを照らしあわせて確認していないので、気になりませんでしたが、初心者だとわからなくなる人もいるだろうなーって他人事のように思っていました。すみません。

      位置は関数名で確認して、気にしないほうがいいと思います。

    • ryo_
    • 2014年 11月12日

    こんにちは。
    参考書通りに進めていたのですが、PART7の最後のWeb画面表示のところで、サイトの端が切れてしまいます。
    画面内に収まらないのは何故なのでしょうか。参考書に載せていないレイアウトの設定とかしていますか?

      • mkino
      • 2014年 11月12日

      Autolayoutの設定が必要になります。
      Pinのレイアウトの設定で、四辺に追随させてください。
      確かに本文では説明が足りなかったですね。
      ビデオおよび電子版で補足します。

        • ryo_
        • 2014年 11月12日

        ありがとうございます。無事に表示出来ました。

    • ken
    • 2014年 12月18日

    こんにちは。
    「たのしいSwiftプログラミング」を読み進めています。
    以前某社の講座に通っても「とりあえずそう書いておいて下さい」という程度の説明だったところが丁寧に解説されていてとても分かりやすく思っています。

    とはいえ、4章からは私にとっては急にハードルが上がった感じがしています。
    P168のテーブルの色を変えるところが何度やってもエラーが出てしまいます。

    具体的には、
    var controller = MyController()
    controller.view.backgroundColor = UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0)
    というコードを書くと、下記のダイアログが表示されます。

    Communication with the playground service was interrupted unexpectedly.
    The playground service
    “com.apple.dt.Xcode.Playground” may have
    generated a crash log.

    更に
    .backgroundColor = UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0)
    の箇所を削除すると

    Error running playground.
    An error occured while trying to communicate with a helper application. You may need to restart Xcode before playgrounds will run again.

    というXcodeの再起動を促すダイアログが表示されます。

    書籍と動画を見ながら記述し、更に正誤表も確認しましたが特に記載はないようでした。
    どのようにすれば、上記のエラーが回避できるでしょうか。

    また、この書籍の項目に沿った読者同士のコミュニティなどはありませんでしょうか。
    (Codecademyの用になっていたら便利だなと思ったので・・・)

      • mkino
      • 2014年 12月18日

      テーブルの背景色の設定は、Xcode 6.0では動作していたのですが、
      Xcode 6.1以降からはPlaygroundでは動作しなくなりました。
      文法や機能的には問題ないので、Playgroundの問題と考えています。
      最新版となるアプリ版では、この記述は削除しています。

      書籍のコミュニティとなるものとしては、いまアプリ版にコメント機能を実装していますので、
      それがそういった場になることを期待しています。

      書籍の購入者はアプリ版を無料で使うことができるので、お試しください。

        • ken
        • 2014年 12月19日

        ご回答ありがとうございます。
        テーブルの背景色について了解しました。

        アプリ版のコメント機能の実装、楽しみにしています。それがあると学習効果も高まりそうですね。

    • swift初心者
    • 2014年 12月20日

    こんにちは
    本誌ならび、アプリ版で進めてさせていただいているものなのですが、用意されてるサンプルプログラムの「 PART9」のファイルを実行しようとすると、ビルドはうまくいくのですが、更新ボタンを押すと以下のエラーが発生して、内容が表示されません。

    fatal error: unexpectedly found nil while unwrapping an Optional value

    エラー箇所は以下です。
    ==

    viewController.swift
    93行目

    var dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

    ==

    エラー内容
    Thread6: EXC_BAD_INSTRUCTION(code=EXC_1389_INVOP,subcode=0x0)

    ==

    以上です。

    いろいろ調べてみたのですが、初心者でわからず、
    原因おわかりでしたら教えていただければと思います。

    よろしくお願いいたします。

      • mkino
      • 2014年 12月24日

      エラーを直訳すると、「オプショナルの値をアンラップしたときに、期待していないnilが返ってきた」ってことです。
      つまり、nilが来るべきではないところでnilが来た、ということですね。

      何がnilかとういうと、おそらくダウンロードしたデータではないかと。
      なんらかの原因で、ネットワークからのデータの取得に失敗していると思われます。
      ということで、まずネットが接続しているかどうか? を確認してください。
      次に、ViewController.swiftの9~11行目にURLアドレスがありますが、
      それをWebブラウザで開いてみて、期待通りのデータが得られるどうか、確認してください。

      予想ならば、どちらかで問題がおきるんじゃないかと思います。

        • nao
        • 2015年 1月12日

        こんにちは。
        同じエラーでココにたどり着いた初心者です。
        iOS Simulatorの場合ですが、
        上記の回答(取得に失敗している)からurlのhttpをhttpsにしたら少し改善したので、
        セキュリティソフトを無効にしてみたところ正常に動きました。
        (web制限機能かな?)
        少しでも参考になればと思い、書き込みさせていただきました。

        • dubudda
        • 2015年 3月14日

        今更のコメントで申し訳ありません。

        僕も同じエラーになります。
        ネット接続、URLからデータは取得できています。

        Thread3: EXC_BAD_INSTRUCTION(code=EXC_1386_INVOP,subcode=0×0)

        上記のエラーがでています。

        他のURLに変更しても変化がないので、別のところに原因があるのかなと思っていますが。。。

        よろしくお願い致します。

          • dubudda
          • 2015年 3月14日

          エラー箇所追記です。

          var dateStr = entry[“publisheDate”] as String

          申し訳ありません。

    • ken
    • 2014年 12月24日

    先日は、ご回答ありがとうございます。

    結局、5章(PART 5)のテーブルの解説が理解できずに詰まってしまいました。その前の部分まではあるていど分かっていたつもりなのですが、テーブルのところでわからなくなってしまいました。

    これは、P171のコードを暗記するような感じで進めるのがよいのでしょうか。
    どの様に学んでいったらいいかなどアドバイスいただけましたら幸いです。

    とりあえず今試していることは、Quizletで用語をマスターしようとしています。

      • mkino
      • 2014年 12月24日

      私がオススメする勉強方法は、トライ・アンド・エラーです。
      まず、とにかくサンプルコードを動かします。手で入力してもいいですし、ダウンロードしたものでもいいです。

      そうしたら、それを少しづつ変化させていきます。
      テーブルの行数を変えてみようか?
      表示する文字列を変えてみようか?
      画像を表示できないだろうか?

      やり方がわからなくとも、とにかくやってみます。
      ポイントは、戻れるところを用意しておくことです。
      このやり方ではうまくいかなかったから、
      もう一度戻って別の方法を試してみよう、
      っていう考え方です。
      これがトライ・アンド・エラーですね。

        • ken
        • 2014年 12月25日

        ご回答ありがとうございます。
        戻れるところを用意しつつ、トライ・アンド・エラーを試してみます。

    • ken
    • 2014年 12月25日

    早速、Try & Errorを試してみました。
    そこで、アプリ版の記載漏れだと思われる箇所を見つけました。

    PART 5のP176からのサンプルコードは見当たらなかったので、アプリのものをコピーして使ったのですが、下から9行目が、

    cell.textLabel.text = iphones[indexPath.row]

    となっています。これは、紙バージョンのように

    cell.textLabel?.text = iphones[indexPath.row]

    正しいのではないかと思いました。いかがでしょうか。

    • dubudda
    • 2015年 3月14日

    dubudda :
    エラー箇所追記です。
    var dateStr = entry[“publishedDate”] as String
    申し訳ありません。

      • dubudda
      • 2015年 3月14日

      何度も申し訳ありません。
      入力ミスでした。
      お騒がせ致しました。

    • JJ
    • 2015年 5月9日

    初めまして。私はプログラミング初心者ですが、「たのしいSwiftプログラミング」を参考に
    Swiftの勉強をしております。
    その中で記載と実際の挙動が異なる部分がありましたので質問させてください。

    P.167、テーブルをplaygroundにて表示するのを試してみて見ようとすると
    本の中では6行目の部分で
    「{MyController}」
    と表示されているようですが、私が行ったところ
    「{}」
    という表示が出ており、7行目のクイックルックでもテーブルの
    表示がされません。

    Xcodeは最新の6.3を利用しているのですが、これが何かしら起因しているのでしょうか。
    可能であればご回答いただければと思います。

      • JJ
      • 2015年 5月9日

      すいません、何故か一部文字列が消えてしまっていますね。
      私が行ったところ表示されるのは
      __lldb_expr_84.MyController: 0x7fa970c13fd0
      がカッコで閉じられている文字列です。
      (これであれば表示されるでしょうか・・・)

      正しくテーブルを表示させる方法をご教授いただければと思います。

      • mkino
      • 2015年 5月10日

      『たのしいSwiftプログラミング』をお買い上げいただきありがとうございます。
      一般的に、現在のコンピュータの分野は技術の更新頻度が激しく、
      過去に問題なく動いていたものが、最新の環境だと表示が変わったり動かなくなったりすることがあります。

      『たのしいSwiftプログラミング』初版では、Xcode 6.0での動作確認を行ったものを記載しています。
      現時点でのXcodeの最新バージョンは6.3であり、多くの箇所で変化しています。

      この状況に対応するために、本書のアプリ版である『たのしいアプリプログラミング 〜 Swiftではじめよう!』が、
      App Storeから配信されています。
      アプリ版では、最新のXcode 6.3に対応した記述に更新されています。
      こちらでご確認ください。

      紙版の『たのしいSwiftプログラミング』を購入された方は、
      無料でアプリ版をご利用できます。

        • JJ
        • 2015年 5月10日

        ご返信ありがとうございます。
        アプリ版については把握しておりませんでした。
        そちらをダウンロードの上再度確認させていただきます。
        迅速なご回答ありがとうございました。

  1. トラックバックはまだありません。