TAKASHINGS BLOG

仕事のこととか日記とか。映画大好きです。

現場のためのSwift4 Swift4.1+Xcode9.3 対応 <正誤表>

現場のための Swift4 Swift4.1+Xcode9.3 対応 <正誤表>


●146ページ 「ライフサイクルメソッドで呼ばれるメソッド」1行目

【誤】 viewDidLoad:インスタンス化された直後
【正】 viewDidLoad:ViewControllerが自身のViewをメモリ上にロードした直後

●157ページ 本文1~4行目

【誤】
これは「print(array[4])」の箇所でエラーが発生します。理由は array が格納している数に対して、それ以上の箇所へのアクセスを行おうとしているためです。あるはずのない箇所=nil へのアクセスを行おうとしているため、クラッシュしてしまいます。

【正】
これは「print(array[4])」の箇所でエラーが発生します。理由は array が格納している数に対して、それ以上の箇所へのアクセスを行ったためです。配列のインデックスの範囲外にアクセスしようとした場合、実行時にクラッシュしてしまいます。

●179~180ページ 本文8行目以降、コード「役割は関数だが、変数として利用したい場合の一例」の最後まで

【誤】
また、クロージャーの一番の使いどころは、関数としての役割を持ちながらも変数として扱いたい場合です。
▼役割は関数だが、変数として利用したい場合の一例[sample-6-8-5.playground]

struct MyStruct {
    var valueOne: Int = 50
    var valueTwo: Int = 55

    // 2つの変数の和が 100 を超えているか判定
    var isOverTotalHundred: Bool {
        return (valueOne + valueTwo) > 100
    }
}

let myStruct = MyStruct()
if myStruct.isOverTotalHundred {
    print(myStruct.valueOne)
} else {
    print(myStruct.valueTwo)
}
// 50(myStruct.valueOne の値を表示)

本来であれば関数として定義しますが、変数として関数の振る舞いを行います。また、変数には値を保持する必要はありません。関数を意識せず変数のように扱えることがポイントです。

【正】
上記内容を削除
理由: 該当箇所はクロージャーについて解説している内容を記載していましたが、サンプルコードの使用方法ならびに、それに付随する解説はクロージャーではなく「計算型プロパティ(computed property)」の使用例、解説となります。深くお詫び申し上げます。
計算型プロパティは一見変数のように見えますが、中身はメソッドのように特定の処理を行うものです。クラス、構造体、列挙型で定義することが可能です。また、計算型プロパティは特定の値を保持することができないという特徴もあります。

●194、195ページ ▼UIViewControllerのviewと同じサイズのUIViewを追加する一例 ソースコード

【誤】

// 上、右、左、下の順でNSLayoutConstraintを使用して制約を付ける
layoutView.addConstraint(NSLayoutConstraint(item: self.view,
                                          attribute: NSLayoutAttribute.top,
                                          relatedBy: NSLayoutRelation.equal,
                                          toItem: layoutView,
                                          attribute: NSLayoutAttribute.top,
                                          multiplier: 1.0,
                                          constant: 0))

layoutView.addConstraint(NSLayoutConstraint(item: self.view,
                                          attribute: NSLayoutAttribute.right,
                                          relatedBy: NSLayoutRelation.equal,
                                          toItem: layoutView,
                                          attribute: NSLayoutAttribute.right,
                                          multiplier: 1.0,
                                          constant: 0))

layoutView.addConstraint(NSLayoutConstraint(item: self.view,
                                          attribute: NSLayoutAttribute.left,
                                          relatedBy: NSLayoutRelation.equal,
                                          toItem: layoutView,
                                          attribute: NSLayoutAttribute.left,
                                          multiplier: 1.0,
                                          constant: 0))

layoutView.addConstraint(NSLayoutConstraint(item: self.view,
                                          attribute: NSLayoutAttribute.bottom,
                                          relatedBy: NSLayoutRelation.equal,
                                          toItem: layoutView,
                                          attribute: NSLayoutAttribute.bottom,
                                          multiplier: 1.0,
                                          constant: 0))

【正】

// 上、右、左、下の順でNSLayoutConstraintを使用して制約を付ける
self.view.addConstraint(NSLayoutConstraint(item: self.view,
                                       attribute: NSLayoutAttribute.top,
                                       relatedBy: NSLayoutRelation.equal,
                                       toItem: layoutView,
                                       attribute: NSLayoutAttribute.top,
                                       multiplier: 1.0,
                                       constant: 0))

self.view.addConstraint(NSLayoutConstraint(item: self.view,
                                       attribute: NSLayoutAttribute.right,
                                       relatedBy: NSLayoutRelation.equal,
                                       toItem: layoutView,
                                       attribute: NSLayoutAttribute.right,
                                       multiplier: 1.0,
                                       constant: 0))

self.view.addConstraint(NSLayoutConstraint(item: self.view,
                                       attribute: NSLayoutAttribute.left,
                                       relatedBy: NSLayoutRelation.equal,
                                       toItem: layoutView,
                                       attribute: NSLayoutAttribute.left,
                                       multiplier: 1.0,
                                       constant: 0))

self.view.addConstraint(NSLayoutConstraint(item: self.view,
                                       attribute: NSLayoutAttribute.bottom,
                                       relatedBy: NSLayoutRelation.equal,
                                       toItem: layoutView,
                                       attribute: NSLayoutAttribute.bottom,
                                       multiplier: 1.0,
                                       constant: 0))
●214ページ 「イベント通知の身近な例」2行目

【誤】 NSNotificationCenter
【正】 NotificationCenter
※Swift 3.0 より Foundation Framework に含まれる一部のクラス、プロトコルから接頭辞の NS が削除されました。Swift では NotificationCenter を使用します。

●215ページ 1行目

【誤】 NSNotificationCenter
【正】 NotificationCenter

●215ページ 図7-2-1の表題及び図の内部

【誤】 NSNotificationCenter
【正】 NotificationCenter
※Swift 3.0 より Foundation Framework に含まれる一部のクラス、プロトコルから接頭辞の NS が削除されました。Swift では NotificationCenter を使用します。

●223 ページ ▼ SwitchCell クラスファイルにデリゲートメソッドのプロトコルを追加 3 行目

【誤】 protocol SwitchCellDelegate {
【正】 protocol SwitchCellDelegate: AnyObject {
※「AnyObject」の箇所は「class」と書くこともできます。Xcode で「class」の定義にジャンプすると「AnyObject」の定義が表示されるようになっています。

●224ページ ▼SwitchCellクラスファイルにデリゲートメソッドのプロトコルを追加 3行目

【誤】 var delegate: SwitchCellDelegate? = nil // 変数を追加
【正】 weak var delegate: SwitchCellDelegate? = nil // 変数を追加
※循環参照が発生し、メモリリークとなる恐れがあるため。

●229ページ ▼NSNotificationCenterクラスを利用した通知の一例 コードのタイトル

【誤】 NSNotificationCenter
【正】 NotificationCenter
※Swift 3.0 より Foundation Framework に含まれる一部のクラス、プロトコルから接頭辞の NS が削除されました。Swift では NotificationCenter を使用します。

●229 ページ ▼ NSNotificationCenter クラスを利用した通知の一例 1 行目

【誤】 NSNotification.Name
【正】 Notification.Name

●232 ページ ▼ FirstViewController クラス内で行う通知元の設定 6~7 行目

【誤】 NSNotification.Name
【正】 Notification.Name

●233 ページ ▼ SecondViewController クラス内で行う通知元の設定 下から 2~3 行目

【誤】 NSNotification.Name
【正】 Notification.Name

●233 ページ ▼ FirstViewController クラス内で行う通知先の設定 下から 3~4 行目

【誤】 NSNotification.Name
【正】 Notification.Name

●234 ページ ▼ SecondViewController クラス内で行う通知先の設定 下から 3~4 行目

【誤】 NSNotification.Name
【正】 Notification.Name

●485 ページ ▼ iOS のバージョンの分岐処理 3 行目

【誤】 self.navigationItem.title = "記事一覧"
【正】 self.navigationItem.title = "最新記事"

●517ページ 5行目、及び下から2行目

【誤】 ProvisioningFiles
【正】 Provisioning Profile

●518ページ 「ProvisioningFiles」作成の流れ タイトル及び下から2行目

【誤】 ProvisioningFiles
【正】 Provisioning Profile

●518ページ 本文2、3、5行目

【誤】 ProvisioningFiles
【正】 Provisioning Profile

<本書サポートサイト>
http://www.shuwasystem.co.jp/support/7980html/5442.html

<本書に関する補足記事>
http://takashings.hatenablog.com/entry/2018/06/08/002712