iPhone/iPadプログラミングバイブル Swift/iOS8/Xcode6対応
布留川英一
新言語SwiftとiOS8に完全対応!!
- 定価
- 3,080円(本体価格 2,800円)
- 発売日
- 2014年10月23日
- 判型/ページ数
- B5変形/568ページ(オール2C)/4C口絵付き
- ISBN
- 978-4-88337-952-1
- 備考
- -
SOLD OUT
本書は、好評の「iPhone/iPad/iPod touchプログラミングバイブル」の改定版です。新言語のSwiftとiOS 8に完全対応し、50本のサンプルプログラムでSwiftを使ったiOSアプリの使い方を徹底的に解説しています。
なお、iOS 8.1とXcode 6.1におけるSwiftの仕様変更に伴う、本書の変更点については、下記の正誤情報のページをご参照ください。
Chapter 1 iOSアプリ作成の基礎
1-1 iPhone/iPadとiOS
1-2 開発ツールの準備
1-3 プロジェクトの作成
1-4 はじめてのiOSアプリの作成
1-5 iOS端末での実行
Chapter 2 Swiftの文法
2-1 変数
2-2 クラスとオブジェクト
2-3 ループ
2-4 条件分岐
2-5 配列と連想配列
2-6 クラスの定義
2-7 オプショナル
Chapter 3 基本API
3-1 文字列の描画
3-2 イメージの描画
3-3 図形の描画
3-4 タッチイベントの処理
3-5 タイマーの処理
Chapter 4 ユーザーインタフェース
4-1 ラベルとイメージビュー
4-2 ボタンとアラート
4-3 テキストフィールド
4-4 エディットテキスト
4-5 スライダーとスイッチ
4-6 WEBビュー
4-7 マップビュー
4-8 ナビゲーションとテーブルビュー
4-9 ピッカービュー
4-10 Interface BuilderによるUIデザイン
4-11 Interface Builderによるビュー遷移
Chapter 5 データの読み書きと通信
5-1 ファイルの読み書き
5-2 プリファレンスの読み書き
5-3 HTTP通信
5-4 Multipeer Connectivity
5-5 メールの送信
5-6 iCloud
Chapter 6 デバイス制御
6-1 センサー
6-2 位置情報
6-3 カメラとフォトアルバム
6-4 アドレス帳
6-5 バックグラウンドタスク
6-6 App Extensions – Action
6-7 App Extensions – Today
6-8 TouchID認証
Chapter 7 サウンドとムービーとアニメーション
7-1 サウンドの再生
7-2 ムービーの再生
7-3 UIViewビューアニメーション
7-4 レイヤーアニメーション
7-5 トランジション
Chapter 8 ゲーム
8-1 SpriteKit
8-2 シーン間のトランジション
8-3 物理シミュレーション
8-4 SceneKit
Chapter 9 アプリケーションの作成
9-1 パズルゲーム
9-2 アクションゲーム
9-3 シューティングゲーム
9-4 ロールプレイングゲーム
9-5 Twitterクライアント
Appendix
・Playgroundによるプログラム試行
ダウンロードデータ
本書で解説したサンプルデータをダウンロードできます。
なお、使用方法などに関しては、必ず書籍の該当箇所をご確認の上、ご利用ください。
ダウンロード後、解凍したファイル内に「readme.txt」ファイルなどが含まれる場合は、使用前にこちらもご確認ください。
(約13MB。zip形式で圧縮してありますので、ダウンロード後解凍してください)
正誤情報
◆初版と第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をクリックしてください。
◆ 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
お問い合わせ
本書に関するお問い合わせは、下記のボタンをクリックしてお問い合わせフォームよりお問い合わせください。