読者サポート

iPhone/iPadプログラミングバイブル Swift/iOS8/Xcode6対応

著者:
布留川英一
定価:
3,024円(本体価格 2,800円)
発売日:
2014年10月23日

ダウンロード

本書で解説したサンプルデータをダウンロードできます。 なお、使用方法などに関しては、必ず書籍の該当箇所をご確認の上、ご利用ください。 ダウンロード後、解凍したファイル内に「readme.txt」ファイルなどが含まれる場合は、使用前にこちらもご確認ください。

正誤情報

当書籍について、現在以下の記述ミスが発見されております。 大変ご迷惑をおかけしますが、以下をご参照いただきますよう、よろしくお願いいたします。

◆初版と第2刷の修正

◆ Xcode 6.3へのバージョンアップに関する修正

Xcode6.3からSwift1.2が採用されているため、言語仕様が全体的に変更になりました。
主な変更箇所は次の通りになります。

◎「as」でダウンキャストしている場所では「as!」が必須
【例】
let button = UIButton.buttonWithType(UIButtonType.System) as UIButton

let button = UIButton.buttonWithType(UIButtonType.System) as! UIButton

◎暗黙的にNSStringからString へのキャストしてた場所で、明示的なキャストが必須
【例】
func showAlert(title: NSString?, text: NSString?) {
let alert = UIAlertController(title: title as? String, message: text as? String,
preferredStyle: UIAlertControllerStyle.Alert)

func showAlert(title: NSString?, text: NSString?) {
let alert = UIAlertController(title: title as? String, message: text as? String,
preferredStyle: UIAlertControllerStyle.Alert)

◎命令自体が変更
【例】
if countElements(textView.text) + countElements(text) > 140 {

if count(textView.text) + count(text) > 140 {

【例】
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
//タッチオブジェクトの取得(3)
let objects = touches.allObjects
for var i = 0; i < objects.count; i++ { _touches.append(objects[i] as UITouch) } ↓ override func touchesBegan(touches: Set, withEvent event: UIEvent) {
//タッチオブジェクトの取得(3)
let objects = touches.allObjects
for touch in touches {
_touches.append(touch as! UITouch)
}

◎クラスライブラリのOptional指定の変更
【例】
cell!.textLabel.text = _names[indexPath.row]

cell!.textLabel.!text = _names[indexPath.row]

なお、弊社サイトからダウンロードでできるサンプルファイルは修正済みとなります(2015.4.27)。

◆ Xcode 6.3へのバージョンアップ以外の修正

P108の上のコードの2行目
誤: array.insert(3,atIndex:3) →[3,0,1,2]

正: array.insert(3,atIndex:3) →[0,1,2,3]

P176の表4-2-1から表4-2-3
表の掲載順に誤りがありました。正しくは下記のようになります。
 表4-2-1の位置に表4-2-2
 表4-2-2の位置に表4-2-3
 表4-2-3の位置に表4-2-1

◆初版の修正
本書の執筆はXcode 6.0で行っておりますが、刊行後に発表されたXcode 6.1では、下記のような仕様の変更がありました。

・コンストラクタの戻り値がオプショナルな型になりました。
・コンストラクタ以外でオブジェクトを生成する関数(NSURL.URLWithString()、NSData.dataWithContentsOfFile()、GameScene.sceneWithSize()など)がなくなり、コンストラクタでの生成に統一されました。

上記の仕様の変更によりサンプルプログラムに下記のような変更が必要になります。なお、サンプルプログラムは下記の変更が行われたものがダウンロードできます。

下記の修正を反映した本文のページのPDFファイルをダウンロードできます。ダウンロードされる方は下記のURLをクリックしてください。

  • 「iPhone/iPadプログラミングバイブル Swift/iOS8/Xcode6対応」初版の正誤表を本文に反映したPDFのダウンロード
  • ◆ Xcode 6.1へのバージョンアップに関する修正

    2014年10月27日

    TodayEx P379の下から5行目、P381の「6-7-5 TodayExのソースコードの解説」の12行目からの囲み
    Xcode6.1対応の追加。

    誤:
    let userDefaults = NSUserDefaults(suiteName: "group.TodayEx")

    let userDefaults = NSUserDefaults(suiteName: "group.TodayEx")!

    2014年10月23日

    ObjectEx P84のコードの10行目
    誤: NSCalendar(calendarIdentifier: NSGregorianCalendar)

    正: NSCalendar(calendarIdentifier: NSGregorianCalendar)!

    LabelEx P168の1行目
    誤: image: UIImage(named: "sample.png"))

    正: image: UIImage(named: "sample.png")!)

    ButtonEx P174の13行目
    誤: image: UIImage(named: "sample.png"), tag: BTN_IMAGE)

    正: image: UIImage(named: "sample.png")!, tag: BTN_IMAGE)

    WebViewEx P202の21行目
    誤: var url: NSURL = NSURL.URLWithString("http://npaka.net")

    正: var url: NSURL = NSURL(string: "http://npaka.net")!

    NativationEx P218の下から8行
    誤: cell!.textLabel!.text = files![indexPath.row]
    if cell!.textLabel!.text!.hasPrefix("フォルダ") {

    正: cell!.textLabel.text = files![indexPath.row]
    if cell!.textLabel.text!.hasPrefix("フォルダ") {

    FileEx P263の11行目、P265のコードの囲み
    誤: return NSString(data: data, encoding: NSUTF8StringEncoding)

    正: return NSString(data: data, encoding: NSUTF8StringEncoding)!

    FileEx P263の25行目
    誤: return NSData.dataWithContentsOfFile(path,
    options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil)

    正: return NSData(contentsOfFile: path,
    options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil)

    HttpEx P276の10行目
    誤: return NSString(data: data, encoding: NSUTF8StringEncoding)

    正: return NSString(data: data, encoding: NSUTF8StringEncoding)!

    HttpEx P276の19行目
    誤: let URL = NSURL(string: url)

    正: let URL = NSURL(string: url)!

    MultipeerConnectivityEx P286の下から7行目
    誤: return NSString(data: data, encoding: NSUTF8StringEncoding)

    正: return NSString(data: data, encoding: NSUTF8StringEncoding)!

    ICloudEx P309の1行目
    誤: self.text = NSString(data: contents as NSData,
    encoding: NSUTF8StringEncoding)

    正: self.text = NSString(data: contents as NSData,
    encoding: NSUTF8StringEncoding)!

    AccelerometerEx P320の18行目
    誤: var str = NSMutableString.string()

    正: var str = NSMutableString()

    AddressEx P345の17行目
    誤: var url = NSURL.URLWithString(urlPath)

    正: var url = NSURL(string: urlPath)!

    AddressEx P347の20行目
    誤: cell!.textLabel?.text = _names[indexPath.row]

    正: cell!.textLabel.text = _names[indexPath.row]

    ActionEx P366の18行目
    誤: image: UIImage(named: "sample.png"))

    正: image: UIImage(named: "sample.png")!)

    TodayEx P381の2行目
    誤: let defaults:NSUserDefaults = NSUserDefaults(suiteName: "group.TodayEx")

    正: let defaults:NSUserDefaults = NSUserDefaults(suiteName: "group.TodayEx")!

    ViewAnimationEx P407の14行目
    誤: image: UIImage(named: "sample.png"))

    正: image: UIImage(named: "sample.png")!)

    LayerAnimationEx P417の3行目
    誤: layer.contents = image.CGImage

    正: layer.contents = image!.CGImage

    SpriteKitEx P431の下から4行目
    誤: let scene = GameScene.sceneWithSize(skView.frame.size)

    正: let scene = GameScene(size: skView.frame.size)

    SceneTransactionEx P442のコードの17行目
    誤: let scene = GameScene.sceneWithSize(skView.frame.size)

    正: let scene = GameScene(size: skView.frame.size)

    SceneTransactionEx P443の下から7行目
    誤: let scene = GameScene.sceneWithSize(self.frame.size)

    正: let scene = GameScene(size: self.frame.size)

    PhysicsEx P449の6行目
    誤: let scene = GameScene.sceneWithSize(skView.frame.size);

    正: let scene = GameScene(size: skView.frame.size)
    ※不必要な「;」も削除

    SceneKitEx P459の6行目
    誤: let modelScene = SCNScene(named: "art.scnassets/model.dae")

    正: let modelScene = SCNScene(named: "art.scnassets/model.dae")!

    PuzzleGame P472の下から5行目
    誤: image: UIImage(named: "bg.png"))

    正: image: UIImage(named: "bg.png")!)

    PuzzleGame P473の1行目
    誤: image: UIImage(named: "picturebg.png"))

    正: image: UIImage(named: "picturebg.png")!)

    PuzzleGame P473の10行目
    誤: let picture = UIImage(named: "picture.png")
    let piece = UIImage(named: "piece.png")

    正: let picture = UIImage(named: "picture.png")!
    let piece = UIImage(named: "piece.png")!

    PuzzleGame P473の24行目
    誤: image: UIImage(named: "start.png"), tag: BTN_START)

    正: image: UIImage(named: "start.png")!, tag: BTN_START)

    ActionGame P488の12行目
    誤: _images.append(UIImage(named: "act\(i).png"))

    正: _images.append(UIImage(named: "act\(i).png")!)

    ShootingGame P501のリスト9-3-1の下から5行目
    誤: let scene = GameScene.sceneWithSize(CGSizeMake(360, 640))

    正: let scene = GameScene(size: CGSizeMake(360, 640))

    RPG P515の26行目
    誤: _images.append(UIImage(named: "rpg\(i).png"))

    正: _images.append(UIImage(named: "rpg\(i).png")!)

    TwitterClient P531の下から2行目
    誤: let request = NSURLRequest(URL: NSURL.URLWithString(status.iconURL),

    正: let request = NSURLRequest(URL: NSURL(string: status.iconURL)!,

    TwitterClient P532の19行目
    誤: let url = NSURL.URLWithString(
    "https://api.twitter.com/1.1/statuses/home_timeline.json")

    正: let url = NSURL(string:
    "https://api.twitter.com/1.1/statuses/home_timeline.json")!

    TwitterClient P533のリスト9-5-1の下から3行目
    誤: return NSString(data: data, encoding: NSUTF8StringEncoding)

    正: return NSString(data: data, encoding: NSUTF8StringEncoding)!

    ◆ Xcode 6.1へのバージョンアップ以外の修正

    2014年11月12日

    ActionGame P490の23行目とP496の2行目
    誤: _blockH[_blockNum-1] = _blockH[10]-1

    正: _blockH[_blockNum-1] = _blockH[_blockNum-2]-1

    ActionGame P487のリスト9-2-2
    変数keyと変数tickは、あっても問題ありませんが不必要なものでした。
    下記の行を削除。

    ・P487の10行目~12行目
    //キー定数
    let KEY_NONE = -1 //なし
    let KEY_SELECT = 6 //選択

    ・P487の21行目
    var _key = 0 //キー

    ・P487の23行目
    var _tick = 0 //時間経過

    ・P489の18行と19行目
    _tick = 0
    _key = KEY_NONE

    ・P491の22行~25行目
    //時間経過
    _key = -999
    _tick++
    if _tick > 999 {_tick = 100}

    2014年10月27日

    CameraEx P338の22行目
    iPad判定の「!」が消えたので修正。

    誤:
    if model.containsString("iPad") {

    正:
    if !model.containsString("iPad") {

    AddressEx P346の13行目
    アドレス帳に氏名がないデータがあった時に落ちるので対処。

    誤:
    var firstName = ABRecordCopyValue(record,
    kABPersonFirstNameProperty).takeUnretainedValue() as String
    var lastName = ABRecordCopyValue(record,
    kABPersonLastNameProperty).takeUnretainedValue() as String

    正:
    var firstName =
    ABRecordCopyValue(record, kABPersonFirstNameProperty) == nil ? "" :
    ABRecordCopyValue(record, kABPersonFirstNameProperty)
    .takeUnretainedValue() as String
    var lastName =
    ABRecordCopyValue(record, kABPersonLastNameProperty) == nil ? "" :
    ABRecordCopyValue(record, kABPersonLastNameProperty)
    .takeUnretainedValue() as String

    サポートページを探す

    タイトル、著者名、ISBNなどで検索してください。

    ※書籍によっては、サポートページがない場合もございます。ご了承ください。

    書籍についてのお問い合わせ

    各サポートページで問題が解決しない場合は、お問い合わせページよりご連絡ください。

    お問い合わせ