書籍概要

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

著者
発売日
更新日

概要

iPhoneアプリ作りにチャレンジしてみたいけど,プログラミング経験がなくても大丈夫?
本書は,そんな疑問にこたえます!

本邦初!
アプリ開発の専門スクール「RainbowApps」講師陣の手によるやさしい学習書。

実際にアプリを作りながら,楽しくあきずにスキルアップ。
話題のプログラミング言語「Swift」に対応しています。

RainbowAppsは,数多くのアプリ開発未経験者に教えてきました。
そのノウハウがぎっしりと詰め込まれています。

こんな方におすすめ

  • iPhoneアプリ作りに興味があるひと
  • iPhoneアプリ開発を始めてみたいひと

目次

Chapter 1 iPhoneアプリ開発のための環境を構築する

  • 1-1 iPhoneアプリ開発のための環境を構築する
    • iPhoneアプリ開発はMacが無ければ始まらない
    • Xcodeをインストールしよう
    • プログラミング言語で命令をする
    • Swift(スイフト) 最も新しいプログラミング言語
    • どうやってアプリを作っていくの?
    • 世界一受けたいiPhoneアプリ開発の授業の方式

Chapter 2 Xcodeを使ってみよう!

  • 2-1 Xcodeとは何か?
    • Xcodeで出来ること
    • Xcode アプリ開発ツール
  • 2-2 Xcodeでプロジェクトを作成する
    • プロジェクトとは何か?
    • 新規プロジェクトを作成する
    • Xcodeの画面構成
    • Xcodeに触ってみよう!
  • 2-3 Interface Builderで画面をデザインする
    • Interface Builderなら直感的に画面が作れる
    • Interface Builderを使ってみよう!
  • 2-4 プログラムでアプリを動かそう!
    • どういうプログラムをするか?

Chapter 3 新しいプログラミング言語Swift

  • 3-1 Playgroundを使ってSwiftを学ぼう!
    • 新しいプログラミング言語Swift
    • Playgroundに触ってみる
  • 3-2 コメントを使ってプログラムに注釈を書こう
    • コメントとは?
  • 3-3 変数を使いこなそう!
    • 「変数」 の使用がプログラムの基本!
  • 3-4 変数とデータ型
    • 「変数」 は同じタイプどうしでないと計算できない
    • データ型
  • 3-5 配列と辞書
    • 複数のデータを扱えるコレクション
    • 配列を作ろう
    • 配列を使おう
    • 辞書をつくろう
    • 辞書を使おう

Chapter 4 シンプルで簡単な知育アプリを作ろう!

  • 4-1 アプリを作るための企画を立てる
    • アプリはどうやって生まれる?
    • アプリをイメージしてみよう
  • 4-2 本格的にインターフェイス画面を作成しよう!
    • Xcodeで新規プロジェクトを作成する
    • 画面作成のための設定をする
    • Interface Builderでアプリ画面を作成しよう
    • 画面サイズに依存しないAuto Layout
  • 4-3 プログラムでアプリを動かそう
    • どのオブジェクトを操作する?
    • クラスとインスタンス
  • 4-4 アプリをインタラクティブにしよう!
    • アプリの処理の流れをフローチャートにしてみよう
    • UIImageViewとUIImage
    • 制御文を使って判定処理を行う
    • 変数を使ってランダムに信号の色を変える

Chapter 5 楽器アプリでサウンドの扱い方を学ぶ

  • 5-1 音を再生するだけのアプリを作ろう
    • 音を鳴らすにはどうすればよい?
    • シンプルな打楽器,カウベルのアプリを作ろう!
  • 5-2 楽器アプリ「ワインピアノ」を作ろう!
    • 楽器アプリの企画を練る
    • ワインピアノのインターフェイス画面を作成する
    • 引数を持ったメソッドでBGMを鳴らす
    • ワイングラスに音色をつけよう!
  • 5-3 独立したサウンドクラスを作ろう!
    • クラスを作ろう!
    • 複数のインスタンスで音のハーモニーを生み出す
  • 5-4 オブジェクトにアニメーションをつけよう
    • ワイングラスに動きをつけよう!

Chapter 6 「シンプル電卓」でガッツリコーディング

  • 6-1 ストーリーボードを使わずにアプリ開発しよう
    • ストーリーボードを使わない!
    • シンプルな計算機アプリを作ろう
  • 6-2 計算機の機能をプログラミングしよう
    • ボタンをタップしたときの処理
  • 6-3 計算機のデザインを改善しよう
    • 高度な色の設定をしよう!
    • 特殊なフォントを使用する

Chapter 7 四択検定アプリで画面遷移を理解する

  • 7-1 アプリに合った画面遷移の方法
    • これから作るアプリにはどのような画面が必要?
    • モーダル型の画面遷移の作り方
    • ナビゲーション型の画面遷移の作り方
    • タブバー型の画面遷移の作り方
  • 7-2 四択検定アプリを作ろう!
    • 3つの画面を持ったアプリ
    • スタート画面を作成する
    • CSVファイルの読み込み
    • KenteiViewController画面の作成
    • 検定問題の出題と正誤判定をプログラムする
    • 得点画面(ScoreViewController)の作成
    • 検定結果をScoreViewControllerに表示する
  • 7-3 何度も遊んでもらうアプリにする工夫
    • 何度も遊んでもらうアプリにするには...
    • ランダムに問題を出題する
    • 合格回数をアプリに保存する
    • 検定のランクと成績をSNSに投稿する
    • 効果音を設定する

Chapter 8 Webから情報を取得する「ニュースリーダー」アプリ

  • 8-1 JSONデータを取得し,解析する
    • Webで配信されている情報を取得するには
    • プログラミング方針を整理する
    • HTTP通信でサーバにリクエストを出す
  • 8-2 テーブルビューで情報を表示する
    • ニュース記事一覧画面の作成
    • UITableViewの実装
  • 8-3 Webブラウザを作成し,記事を表示する
    • Webブラウザをアプリ内に設置する
    • テーブルビューのデータの受け渡し
    • アプリの仕上げをしよう

Chapter 9 スマホならではのスタンプカメラを作ろう

  • 9-1 カメラ機能をアプリに取り込もう
    • スタンプカメラアプリの概要
    • ユーザーインターフェイスの作成
    • カメラ機能の実装
  • 9-2 スタンプ画像を配置して合成画像を作る
    • スタンプ選択画面の作成
    • コレクションビューの作成
    • スタンプ画像の配置
    • スタンプ画像の削除
    • 画像を合成して保存する
  • 9-3 アプリの最終仕上げ,多言語設定をしよう!
    • ダウンロードされるアプリにするために...
    • アイコンを設定しよう
    • ローカライゼーションを行う
    • 起動画面

Chapter 10 アプリをリリースする準備をしよう

  • 10-1 実機iPhoneで開発したアプリを動かそう!
    • iOS Developer Programへ参加する
    • 実機でアプリをテストするための準備
  • 10-2 プロビジョニングプロファイルの作成
    • プロビジョニングプロファイルとは
    • Certifi cates
    • App IDの作成
    • Deviceの登録
    • プロビジョニングファイルの作成
  • 10-3 iTunes Connect でAppStore配信準備
    • iTunes Connectとは
    • iTunes Connectへのアプリの登録
    • Xcodeからアプリをアップロードする
    • iTunes Connectでレビューを提出

サポート

ダウンロード

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

ダウンロードしていただくファイルは,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]()

商品一覧