No.1スクール講師陣による 世界一受けたいiPhoneアプリ開発の授業 [iOS 8 & Xcode 6 & Swift対応]

サポートページ

この記事を読むのに必要な時間:およそ 0.5 分

ダウンロード

本書のサンプルファイルを,下記リンクからダウンロードすることができます。

ダウンロードしていただくファイルは,ZIP形式の圧縮ファイルです。解凍してお使いください。ダウンロードにミスがあると正しく解凍できませんので,よくお確かめください。

サンプルファイルについて,一般的な環境においては特に問題のないことを確認しておりますが,万一障害が発生し,その結果いかなる損害が生じたとしても,小社および著者はなんら責任を負うものではありません。また生じた損害に対する一切の保証をいたしかねます。必ずご自身の判断と責任においてご利用ください。

本サイトより提供するサンプルファイルの著作権は,著者または各制作者に帰属しています。

サンプルファイルは,著作権法上の保護を受けています。収録されているファイルの一部,あるいは全部について,いかなる方法においても無断で複写,複製,再配布することは禁じられています。

以上のことをご確認,ご了承の上,データをご利用願います。

ダウンロード(Xcode 7+iOS 9対応)
世界一受けたいiPhoneアプリ開発の授業用ファイル_7(約89.4MB,2015年10月22日更新)

Xcode 7が2015年9月17日にリリースされました。
Xcode 7をお使いの方は,上記リンクからダウンロードしてください。

ダウンロード(Xcode 6.3+iOS 8.3対応)
世界一受けたいiPhoneアプリ開発の授業用ファイル_6_3(約28.5MB,2015年4月9日更新)

Xcode 6.3が2015年4月9日にリリースされました。
これからXcode 6.3をお使いの方は,上記リンクからダウンロードしてください。

ダウンロード(Xcode 6~6.2+iOS 8~8.2対応)
世界一受けたいiPhoneアプリ開発の授業用ファイル(約26MB)

補足情報

Xcode 7のアップデートについて

2015年9月17日,Xcodeのバージョンが7にアップデートされ,プログラミング言語であるSwiftも2.0へとアップデートされました。Xcode 7を使用してiPhoneアプリ開発を学習される方は,下記リンクの解説を参照の上,該当箇所のコードを修正してください。また,サンプルファイルはXcode 7対応バージョンをダウンロードしてください。

解説をご覧になるには,アドビシステムズ社が配布しているAdobe Readerが必要です(無償)。Adobe Readerをインストールすることにより,PDFファイルの閲覧・印刷などが可能になります。

Xcode 6.3のアップデートについて

2015年4月9日,アップル社からiOS 8.3が発表されました。これに伴い,iPhoneアプリ開発ツールであるXcodeもバージョンが6.3にアップデートされ,プログラミング言語であるSwiftも1.2へとアップデートされました。

Swiftは1.2になり,パフォーマンスはさらに強化されましたが,コード上では1.1と互換性がない点もあります。そのため,Xcode6.2 & Swift 1.1の環境下で執筆された「世界一受けたいiPhoneアプリ開発の授業」のサンプルコードも,Xcode 6.3 & Swift 1.2ではエラーが出てしまう箇所があります。

Xcode 6.3を使用してiPhoneアプリ開発を学習される方は,下記を参照の上,該当箇所のコードを修正してください。また,サンプルファイルはXcode 6.3対応バージョンをダウンロードしてください。

書籍掲載コードのSwift 1.2への対応について(as演算子への対応)

プログラム実行時に起こるエラー(ランタイムエラー)の可能性があるキャストをする場合は,asではなくas!もしくはas?を使用しないとエラーが出ます。該当箇所と対応方法は次の通りです。

Chapter7
P.220
修正前
let sVC = segue.destinationViewController as ScoreViewController
修正後
let sVC = segue.destinationViewController as! ScoreViewController
P.223
修正前
array.append(sortedArray[arrayCount] as String)
修正後
array.append(sortedArray[arrayCount] as! String)
Chapter8
P.242
修正前
//まずJSONデータをNSDictionary型に
let jsonDic = json as NSDictionary
//辞書化したjsonDicからキー値"responseData"を取り出す
let responseData = jsonDic["responseData"] as NSDictionary
//responseDataからキー値"results"を取り出す
self.newsDataArray = responseData["results"] as NSArray
修正後
//まずJSONデータをNSDictionary型に
let jsonDic = json as! NSDictionary
//辞書化したjsonDicからキー値"responseData"を取り出す
let responseData = jsonDic["responseData"] as! NSDictionary
//responseDataからキー値"results"を取り出す
self.newsDataArray = responseData["results"] as! NSArray
P.247
修正前
// ニュース記事データを取得(配列の要素で"indexPath.row"番目の要素を取得)
var newsDic = newsDataArray[indexPath.row] as NSDictionary
// タイトルとタイトルの行数、公開日時をCellにセット
cell.textLabel?.text = newsDic["title"] as String
cell.textLabel?.numberOfLines = 3
cell.detailTextLabel?.text = newsDic["publishedDate"] as String
修正後
// ニュース記事データを取得(配列の要素で"indexPath.row"番目の要素を取得)
var newsDic = newsDataArray[indexPath.row] as! NSDictionary
// タイトルとタイトルの行数、公開日時をCellにセット
cell.textLabel?.text = newsDic["title"] as? String
cell.textLabel?.numberOfLines = 3
cell.detailTextLabel?.text = newsDic["publishedDate"] as? String
P.250
修正前
// ニュース記事データを取得(配列の要素で"indexPath.row"番目の要素を取得)
var newsDic = newsDataArray[indexPath.row] as NSDictionary
// ニュース記事のURLを取得
newsUrl = newsDic["unescapedUrl"] as String
//ニュースの配信元名を取得
publisher = newsDic["publisher"] as String
修正後
// ニュース記事データを取得(配列の要素で"indexPath.row"番目の要素を取得)
var newsDic = newsDataArray[indexPath.row] as! NSDictionary
// ニュース記事のURLを取得
newsUrl = newsDic["unescapedUrl"] as! String
//ニュースの配信元名を取得
publisher = newsDic["publisher"] as! String
P.258
修正前
//セグエ用にダウンキャストしたWebViewControllerのインスタンス
var wvc = segue.destinationViewController as WebViewController
修正後
//セグエ用にダウンキャストしたWebViewControllerのインスタンス
var wvc = segue.destinationViewController as! WebViewController
Chapter9
P.278
修正前
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as UICollectionViewCell
//セルのなかの画像を表示するImageViewのタグを指定
let imageView = cell.viewWithTag(1) as UIImageView
修正後
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! UICollectionViewCell
//セルのなかの画像を表示するImageViewのタグを指定
let imageView = cell.viewWithTag(1) as! UIImageView
P.283
修正前
var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
修正後
var appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
P.284
修正前
var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
修正後
var appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
P.286
修正前
let lastStamp = canvasView.subviews.last! as Stamp
修正後
let lastStamp = canvasView.subviews.last! as! Stamp
ソースコード一覧
P.337 ソースコード160行目
修正前
let sVC = segue.destinationViewController as ScoreViewController
修正後
let sVC = segue.destinationViewController as! ScoreViewController
P.337 ソースコード179行目
修正前
array.append(sortedArray[arrayCount] as String)
修正後
array.append(sortedArray[arrayCount] as! String)
P.339 ソースコード32行~37行目
修正前
//まずJSONデータをNSDictionary型に
let jsonDic = json as NSDictionary
//辞書化したjsonDicからキー値"responseData"を取り出す
let responseData = jsonDic["responseData"] as NSDictionary
//responseDataからキー値"results"を取り出す
self.newsDataArray = responseData["results"] as NSArray
修正後
//まずJSONデータをNSDictionary型に
let jsonDic = json as! NSDictionary
//辞書化したjsonDicからキー値"responseData"を取り出す
let responseData = jsonDic["responseData"] as! NSDictionary
//responseDataからキー値"results"を取り出す
self.newsDataArray = responseData["results"] as! NSArray
P.339 ソースコード50行~55行目
修正前
// ニュース記事データを取得(配列の要素で"indexPath.row"番目の要素を取得)
var newsDic = newsDataArray[indexPath.row] as NSDictionary
// タイトルとタイトルの行数、公開日時をCellにセット
cell.textLabel?.text = newsDic["title"] as String
cell.textLabel?.numberOfLines = 3
cell.detailTextLabel?.text = newsDic["publishedDate"] as String
修正後
// ニュース記事データを取得(配列の要素で"indexPath.row"番目の要素を取得)
var newsDic = newsDataArray[indexPath.row] as! NSDictionary
// タイトルとタイトルの行数、公開日時をCellにセット
cell.textLabel?.text = newsDic["title"] as? String
cell.textLabel?.numberOfLines = 3
cell.detailTextLabel?.text = newsDic["publishedDate"] as? String
P.339 ソースコード60行~63行目
修正前
// ニュース記事データを取得(配列の要素で"indexPath.row"番目の要素を取得)
var newsDic = newsDataArray[indexPath.row] as NSDictionary
// ニュース記事のURLを取得
newsUrl = newsDic["unescapedUrl"] as String
//ニュースの配信元名を取得
publisher = newsDic["publisher"] as String
修正後
// ニュース記事データを取得(配列の要素で"indexPath.row"番目の要素を取得)
var newsDic = newsDataArray[indexPath.row] as! NSDictionary
// ニュース記事のURLを取得
newsUrl = newsDic["unescapedUrl"] as! String
//ニュースの配信元名を取得
publisher = newsDic["publisher"] as! String
P.340 ソースコード69行目
修正前
//セグエ用にダウンキャストしたWebViewControllerのインスタンス
var wvc = segue.destinationViewController as WebViewController
修正後
//セグエ用にダウンキャストしたWebViewControllerのインスタンス
var wvc = segue.destinationViewController as! WebViewController
P.342 ソースコード96行目
修正前
let lastStamp = canvasView.subviews.last! as Stamp
修正後
let lastStamp = canvasView.subviews.last! as! Stamp
P.343 ソースコード30行~32行目
修正前
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as UICollectionViewCell
//セルのなかの画像を表示するImageViewのタグを指定
let imageView = cell.viewWithTag(1) as UIImageView
修正後
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! UICollectionViewCell
//セルのなかの画像を表示するImageViewのタグを指定
let imageView = cell.viewWithTag(1) as! UIImageView
P.344 ソースコード50行目
修正前
var appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
修正後
var appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

書籍掲載コードのSwift 1.2への対応について(NSSetへの対応)

UIResponderクラスにあらかじめ用意されているタッチ操作のメソッドで,NSSetを使用することができなくなりました。そのためSwiftで導入されたSetというデータ構造を使用します。このSetでは,タッチ情報を取得していたanyObject()が使用できないのでfirstというプロパティを使用します。
該当箇所と対応方法は次の通りです。

Chapter9
P.281
修正前
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
修正後
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
P.282
修正前
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        //画面上のタッチ情報を取得
        let touch = touches.anyObject() as UITouch
修正後
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
        //画面上のタッチ情報を取得
        let touch = touches.first as! UITouch
ソースコード一覧
P.344 ソースコード13行目
修正前
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
修正後
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
P.344 ソースコード18行~20行目
修正前
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        //画面上のタッチ情報を取得
        let touch = touches.anyObject() as UITouch
修正後
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
        //画面上のタッチ情報を取得
        let touch = touches.first as! UITouch

Optionalの表示仕様変更について

Xcode 6.3では,Optionalでも「{Some 10}」のようではなく,「10」のように中身の値がそのまま表示される仕様になっています。

【Chapter3】
P.067 1つ目のソースコードの22行目,本文2行目,2つ目のソースコード22行目と25行目
修正前
{Some 10}
修正後
10
P.069 ソースコード22行目と24行目
修正前
{Some 10}
修正後
10
P.078 1つ目のソースコード6行目,2つ目のソースコード6行目,3つ目のソースコード6行目
修正前
{Some 10}
修正後
10
P.078 3つ目のソースコード7行目
修正前
{Some 55}
修正後
55
P.078 3つ目のソースコード8行目
修正前
{Some 80}
修正後
80
P.079 2つ目のソースコード6行目
修正前
{Some 70}
修正後
70
P.080 2つ目のソースコード8行目
修正前
{Some 70}
修正後
50

書籍掲載コードのSwift 1.2への対応について(count関数への対応)

Swift 1.2では,文字列長をカウントするのにcount関数を使うように変更になりました。
該当箇所と対応方法は次の通りです。

【Chapter3】
P.071 3つ目のソースコード6行目
修正前
str.utf16Count
修正後
count(str.utf16)

AppStoreの価格改定について

P.232掲載の「アプリのマネタイズ」というコラムのなかで,AppStoreで販売されるTier1のアプリ価格を100円と紹介しましたが,2015年4月3日よりAppStoreの価格改定により,Tier1のアプリ価格は120円となりました。Tier2は240円,Tier3は360円,Tier87は118800円となります。

Xcode 6.4へのアップデートに伴うサンプルファイルのエラーの解消

Xcode 6.3+iOS 8.3対応のサンプルファイルをダウンロードしてChapter 8のNewsReaderのプロジェクトを開くとエラーが表示されてしまいます。
以下の方法でエラーを解消できます。

  1. Schemaメニューを「Alamofire iOS」に変更します。
  2. ビルドします(Simulatorは任意のものを選んでください)。
  3. Schemaメニューを「NewsReader」に変更します。
  4. Productメニューで「Clean」を選択します。

以上でエラーが解消して,プロジェクトをビルドすることができます。

また,Xcode 6.4で書籍通りにNewsReaderを制作しても,P.239のAlamofireのインポートでエラーが表示されてしまいます。同様に上記操作を行うことでエラーを解消することができます。

お詫びと訂正(正誤表)

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2015年5月18日更新)

P.075 2つ目のソースコード5~6行目

daysArray[2] = " 水曜 "
daysArray[2]
daysArray[2] = " 水曜 "

P.078 3つ目のソースコード6行目

var scoreDic =scoreDic[" 国語 "]	// 国語の点数を変数 lang に代入
var lang = scoreDic[" 国語 "]	// 国語の点数を変数 lang に代入

P.080 2つ目のソースコード8行目

{Some 70}
{Some 50}

P.129 2つ目のソースコード23行目

player.prepareToPlay()	// 音声を即時再生させる
player?.prepareToPlay()	// 音声を即時再生させる

P.141 ソースコード15行目

var soundArray:[AVAudioPlayer]()
正1
var soundArray:Array = []
正2
var soundArray = [AVAudioPlayer]()

正1,正2のどちらでも構いません

P.158 ソースコード20行目

let screenWidth:Double = Double(UIScreen.mainScreen().bounds.size.height)
let screenHeight:Double = Double(UIScreen.mainScreen().bounds.size.height)

P.172 ソースコード124行目

number1.text = NSString(format:"%.0f",number1)
resultLabel.text = NSString(format:"%.0f",number1)

P.206 ソースコード21~23行目

let csvArray = [String]()
//csvArrayから取り出した問題を格納する配列mondaiArray
let mondaiArray = [String]()
var csvArray = [String]()
//csvArrayから取り出した問題を格納する配列mondaiArray
var mondaiArray = [String]()