木下 誠
HMDT株式会社代表取締役。OS XおよびiOSアプリケーションの開発を行う。開発を手がけたiOSアプリケーションは「大辞泉」「HMDT BOOKS」「音楽のある情景」「GALAPAGOS」「MapFan」「駅探エクスプレス」など。近著に『iOS開発におけるパターンによるオートマティズム』『iPhone SDK 3プログラミング大全』『たのしいCocoaプログラミング[Leopard対応版]』など。
たのしいSwiftプログラミング
[iOS 8&Xcode 6対応]
Description
Appleの新しいプログラミング言語「Swift」の入門解説書。「自分でもアプリを作ってみたい!」と思っているプログラミング未経験者に向けて、Swiftを使ったiPhoneアプリ開発の最初の第一歩を、Mac/iOS開発の第一人者 木下誠さんが、わかりやすく、そしてたのしく、語りかけながら教えます。書籍と連動した解説動画をYouTubeに公開しているので、操作手順の理解をより深めることができます。
※[iOS 8.1&Xcode 6.1]への対応を、下記「正誤表」にまとめましたのでご確認ください。
ISBN:978-4-86100-949-5
定価:本体2,800円+税
仕様:B5判変型/288ページ
発売日:2014年10月25日
著者:木下 誠
Profile
Contents
PART 1 Swiftで始めよう!
1-1 Swift登場! iOSプログラミングを始めるチャンス!
1-2 Swiftの凄さをPlaygroundで体験!
1-3 iOSプログラミングを始めるための準備
1-4 SwiftとCocoa touchフレームワーク
1-5 この本の読み方
PART 2 Playgroundで遊ぼう!
2-1 Playgroundで手早く実験!
2-2 Playgroundで計算をしよう!
2-3 Playgorundでグラフを表示しよう!
2-4 Playgroundで文字列を操作しよう!
2-5 Playgroundで画像を表示しよう!
PART 3 Swiftの文法を学ぼう!
3-1 文法を学ぶということ
3-2 変数
3-3 型
3-4 演算子
3-5 文字列
3-6 配列と辞書
3-7 制御文
3-8 関数
3-9 クロージャ
3-10 クラスと構造体
3-11 プロパティ
3-12 メソッド
3-13 継承
3-14 オプショナル型
PART 4 ボタンを使おう!
4-1 いよいよアプリを作るぜ!
4-2 新規プロジェクトを作成しよう!
4-3 プロジェクトウインドウの使い方
4-4 画面のデザインをしよう!
4-5 デザインとプログラムをつなげよう!
4-6 プログラムを実装しよう!
4-7 実行してみよう!
PART 5 テーブルを使おう!
5-1 テーブルというインタフェース
5-2 Playgroundでテーブルを使ってみよう!
5-3 Swift Newsプロジェクトを発動せよ!
PART 6 ネットワークにつなごう!
6-1 PlaygroundでWebページにアクセス!
6-2 同期と非同期という考え方
6-3 NSURLSessionでダウンロードしよう!
6-4 Swift Newsにネットワークアクセスを組み込め!
PART 7 ニュースを読み込もう!
7-1 ニュースをどうやって取得する?
7-2 RSSのXMLを解析しよう!
7-3 JSONでやってみる?
7-4 Swift Newsにニュース読み込み機能を組み込め!
7-5 ニュースの詳細を表示しよう!
PART 8 TwitterとFacebookを使おう!
8-1 iOSがTwitterとFacebookをサポートしてくれる
8-2 アカウントの設定をしよう!
8-3 Socialフレームワークを追加しよう!
8-4 Twitterに投稿しよう!
8-5 Facebookに投稿しよう!
PART 9 もっといろんな機能を付けよう!
9-1 セルにもっと情報を表示しよう!
9-2 複数のニュースサイトに対応しよう!
9-3 セルに画像を表示しよう!
9-4 最初のセルの表示を変えよう!
PART 10 さらに先へ進もう!
10-1 もっと色んなCocoa touchのクラスを使おう!
10-2 色んなフレームワークを使おう!
10-3 プログラミング解説のサイトを参考にしよう!
10-4 人の真似を恐れるな!
Errata
正誤表:初版第1刷(2015年3月16日最終更新) | |
P.004 ビデオ解説マーク | 誤: MOVE 正: MOVIE |
P.007 | 誤: 3-7-7 switch 正: 3-7-7 switch文 |
P.047 | 誤: 拡張子はなしにしておいて。読み込みに成功すれば、実行結果のところには画像サイズが表示される。 正: 画像のフォーマットがpngの場合、拡張子なしでもいけるぜ。それ以外の場合は、拡張子まで含めて記述してね。 |
P.073 下 | 誤: ECU-JP 正: EUC-JP |
P.082 下 |
誤: 配列ができあがったら、 辞書ができあがったら、 |
P.091 ソースコード下から2行目 | 誤: zはminより小さいまたは 正: Xはminより小さいまたは |
P.093 キャプション | 誤: 条件文付きforルールの文法 正: 条件文付きforループの文法 |
P.098 見出し | 誤: 3-7-7 switch 正: 3-7-7 switch文 |
P.099 | 誤:switch 値 { 正: switch 値 { |
P.103 下 | 誤: 受け取る方は、返り値は普通の方じゃなくて 正: 受け取る方は、返り値は普通の型じゃなくて |
P.104 中 | 誤: クロージャを使うスッキリとして、 正: クロージャを使うとスッキリして、 |
P.144 中 | 誤: まず気になるのは、.swiftという拡張子持つファイル 正: まず気になるのは、.swiftという拡張子を持つファイル |
P.165 上 | 誤: ってセロベースで数えていく。 正: ってゼロベースで数えていく。 |
P.170 | 誤: tableView(numberOfRowsInSection) 正: tableView(tableView, numberOfRowsInSection) |
P.170 | 誤: tableView(cellForRowAtIndexPath) 正: tableView(tableView, cellForRowAtIndexPath) |
P.172 UITableViewクラス | 誤:registerClass:(forCellReuseIdentifier) 正: registerClass(forCellReuseIdentifier) |
P.173 上 | 誤:tableView(numberOfRowsInSection) 正: tableView(tableView, numberOfRowsInSection) |
P.173 上 | 誤:tableView(cellForRowAtIndexPath) 正: tableView(tableView, cellForRowAtIndexPath) |
P.173 | 誤:dequeueReusableCellWithIdentifier() 正: dequeueReusableCellWithIdentifier(identifier) |
P.173 下 | 誤: UITextViewCellにはtextLabelっていうプロパティ 正: UITableViewCellにはtextLabelっていうプロパティ |
P.175 ソースコード2行目と6行目 | 行末のセミコロン(;)をトル | P.175 ソースコード4行目と9行目 | 行頭のfuncを、override funcに |
P.176 ソースコード2行目と3行目と7行目 | 行末のセミコロン(;)をトル |
P.176 ソースコード5行目 | 誤:func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 正: override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
P.176 ソースコード10行目 | 誤:func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 正: override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { |
P.177 ソースコード2行目 | 誤:let cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "detailCell") 正: var cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "detailCell") |
P.187 | 誤: 1ヶ所だけ変えてほしい。dequeueReusableCellwithIdentifier()を呼ぶところ。 正: 1ヶ所だけ変えてほしい。dequeueReusableCellwithIdentifier(identifier)を呼ぶところ。 |
P.194 | 誤:sendSynchronousRequest(returningResponse, error) 正: sendSynchronousRequest(request, returningResponse, error) |
P.195 中 | 誤: まず、先頭にUI Kitをimportする分を 正: まず、先頭にUI Kitをimportする文を |
P.200 NSURLConnectionクラス | 誤:sendAsynchronousRequest(queue, completionHandler) 正: sendAsynchronousRequest(request, queue, completionHandler) |
P.204 NSURLSessionクラス | 誤:dataTaskWithURL(completionHandler) 正: dataTaskWithURL(url, completionHandler) |
P.207 ソースコード2行目の後に挿入 | let newsUrlString = "http://www.apple.com" |
P.215 中 | 誤:同期的読み込みの問題についてはPART 7を
正:同期的読み込みの問題についてはPART 6を |
P.217 NSXMLParserDelegateプロトコル | 誤:parser(didStartElement, namespaceURI, qualifiedName, attributes) 正: parser(parser, didStartElement, namespaceURI, qualifiedName, attributes) |
P.218 NSXMLParserDelegateプロトコル | 誤:parser(foundCharacters) 正: parser(parser, foundCharacters) |
P.219 NSXMLParserDelegateプロトコル | 誤:parser(didEndElement, namespaceURI, qualifiedName) 正: parser(parser, didEndElement, namespaceURI, qualifiedName) |
P.224 NSJSONSerializationクラス | 誤:JSONObjectWithData(options, error) 正: JSONObjectWithData(data, options, error) |
P.231 下 ソースコード3行目 | 行末のセミコロン(;)をトル |
P.235 下 | 誤:tableView(didSelectRowAtIndexPath) 正: tableView(tableView, didSelectRowAtIndexPath) |
P.238 UIWebViewクラス | 誤:loadRequest() 正: loadRequest(request) |
P.239 上 | 誤: 最後に、ViewControllerからDetailController()に、 正: 最後に、ViewControllerからDetailControllerに、 |
P.239 ソースコードファイル名 | 誤: DetailController.swift 正: ViewController.swift |
P.247 下 一文追加 | ライブラリペインからドラッグして追加してくれ。DetailControllerの下にあるツールバーに追加するんだ。2つ追加する。 |
P.251 SLComposeViewControllerクラス | 誤:isAvailableForServiceType() 正: isAvailableForServiceType(serviceType) |
P.252 SLComposeViewControllerクラス | 誤:presentViewController(animated, completion) 正: presentViewController(viewControllerToPresent, animated, completion) |
P.258 UIViewクラス | 誤:viewWithTag() 正: viewWithTag(tag) |
P.264 NSMutableArrayクラス | 誤:sortUsingComparator() 正: sortUsingComparator(cmptr) |
P.268 クラス名 | 誤: UIViewクラス 正: UIImageクラス |
サポート表(iOS 8.1&Xcode 6.1への対応):初版第1刷(2015年3月23日最終更新) | |
P.043 下 ソースコード4行目 | 旧:string.addAttribute(NSFontAttributeName, value: UIFont(name: "Times", size: 48), range: NSMakeRange(0, 6)) 新: string.addAttribute(NSFontAttributeName, value: UIFont(name: "Times", size: 48)!, range: NSMakeRange(0, 6)) |
P.044 ソースコード2行目 | 旧:string.addAttribute(NSFontAttributeName, value: UIFont(name: "Times", size: 48), range: NSMakeRange(0, 6)) 新: string.addAttribute(NSFontAttributeName, value: UIFont(name: "Times", size: 48)!, range: NSMakeRange(0, 6)) |
P.047 ソースコード3行目 | 旧:var image = UIImage(named: "tokyo_iPhone") 新: var image = UIImage(named: "tokyo_iPhone")! |
P.098 下 ソースコード4行目 | 旧:var monthName 新: var monthName: String |
P.105 下 ソースコード | 旧:func dataTaskWithURL(_ url: NSURL!, completionHandler completionHandler: ((NSData!, NSURLResponse!, NSError!) -> 新: func dataTaskWithURL(url: NSURL, completionHandler: ((NSData!, NSURLResponse!, NSError!) -> |
P.131 上 ソースコード2行目 | 旧:var url = NSURL(string: "http://www.apple.com") 新: var url = NSURL(string: "http://www.apple.com")! |
P.131 中 ソースコード2行目 | 旧:var url = NSURL(string: "http://www.apple.com") 新: var url = NSURL(string: "http://www.apple.com")! |
P.131 下 ソースコード2行目 | 旧:var url = NSURL(string: "http://www.apple.com") 新: var url = NSURL(string: "http://www.apple.com")! |
P.132 上 ソースコード2行目 | 旧:var url = NSURL(string: "http://www.apple.com") 新: var url = NSURL(string: "http://www.apple.com")! |
P.132 下 ソースコード2行目 | 旧:var url = NSURL(string: "http://www.apple.com") 新: var url = NSURL(string: "http://www.apple.com")! |
P.133 上 ソースコード2行目 | 旧:var url = NSURL(string: "http://www.apple.com") 新: var url = NSURL(string: "http://www.apple.com")! |
P.133 中 ソースコード2行目 | 旧:var url = NSURL(string: "http://www.apple.com") 新: var url = NSURL(string: "http://www.apple.com")! |
P.168 ソースコード2行目 backgroundColor | 新: backgroundColorの設定をしているが、Xcode 6.1のPlaygroundだと、問題が発生して設定できない。Playgroundではなくプロジェクトを作成すれば、設定できる。 |
P.171 ソースコード下から3行目 | 旧:cell.textLabel?.text = "Swift" 新: cell.textLabel.text = "Swift" |
P.173 UITableViewCellクラス | 旧:var textLabel: UILabel? { get } 新: var textLabel: UILabel { get } |
P.175 ソースコード14行目 | 旧:cell.textLabel?.text = iphones[indexPath.row] 新: cell.textLabel.text = iphones[indexPath.row] |
P.177 ソースコード5行目 | 旧: cell.textLabel?.text = iphones[indexPath.row] 新: cell.textLabel.text = iphones[indexPath.row] |
P.188 ソースコード1行目 | 旧:cell.textLabel?.text = "Swift News" 新: cell.textLabel.text = "Swift News" |
P.190 ソースコード最後の行 | 旧:var url = NSURL(string: urlString) 新: var url = NSURL(string: urlString)! |
P.191 NSURLクラス | 旧:convenience init(string URLString: String) 新: convenience init?(string URLString: String) |
P.193 ソースコード7行目 | 旧:var url = NSURL(string: urlString) 新: var url = NSURL(string: urlString)! |
P.193 ソースコード最後の行 | 旧:var htmlString = NSString(data: data!, encoding: NSUTF8StringEncoding) 新: var htmlString = NSString(data: data!, encoding: NSUTF8StringEncoding)! |
P.194 NSURLConnectionクラス | 旧:class func sendSynchronousRequest(request: NSURLRequest, returningResponse response: AutoreleasingUnsafeMutablePointer 新: class func sendSynchronousRequest(request: NSURLRequest, returningResponse response: AutoreleasingUnsafeMutablePointer |
P.194 NSStringクラス | 旧:convenience init(data: NSData, encoding: UInt) 新: convenience init?(data: NSData, encoding: UInt) |
P.195 ソースコード最後の行 | 旧:let image = UIImage(data: htmlData!) 新: let image = UIImage(data: htmlData!)! |
P.200 ソースコード1行目 | 旧:var url = NSURL(string: urlString) 新: var url = NSURL(string: urlString)! |
P.200 ソースコード7行目 | 旧:var html = NSString(data: data, encoding: NSUTF8StringEncoding) 新: var html = NSString(data: data, encoding: NSUTF8StringEncoding)! |
P.200 NSURLConnectionクラス | 旧:class func sendAsynchronousRequest(request: NSURLRequest, queue queue: NSOperationQueue!, completionHandler handler: (NSURLResponse!, NSData!, NSError!) -> Void) 新: class func sendAsynchronousRequest(request: NSURLRequest, queue: NSOperationQueue!, completionHandler handler: ((NSURLResponse!, NSData!, NSError!) -> Void)!) |
P.203 ソースコード7行目 | 旧:var url = NSURL(string: urlString) 新: var url = NSURL(string: urlString)! |
P.203 ソースコード12行目 | 旧:var string = NSString(data: data, encoding: NSUTF8StringEncoding) 新: var string = NSString(data: data, encoding: NSUTF8StringEncoding)! |
P.204 NSURLSessionクラス | 旧:func dataTaskWithURL(url: NSURL, completionHandler completionHandler: ((NSURL!, NSURLResponse!, NSError!) -> Void)?) -> NSURLSessionDataTask 新: func dataTaskWithURL(url: NSURL, completionHandler: ((NSData!, NSURLResponse!, NSError!) -> Void)?) -> NSURLSessionDataTask |
P.208 ソースコード2行目 | 旧:var url = NSURL(string: newsUrlString) 新: var url = NSURL(string: newsUrlString)! |
P.214 ソースコード5行目 | 旧:var url = NSURL(string: urlString) 新: var url = NSURL(string: urlString)! |
P.214 ソースコード8行目 | 旧:var parser = NSXMLParser(contentsOfURL: url) 新: var parser = NSXMLParser(contentsOfURL: url)! |
P.215 NSXMLParserクラス | 旧:convenience init(contentsOfURL url: NSURL!) 新: convenience init?(contentsOfURL url: NSURL!) |
P.216 ソースコード9行目 | 旧:var url = NSURL(string: urlString) 新: var url = NSURL(string: urlString)! |
P.216 ソースコード12行目 | 旧:var parser = NSXMLParser(contentsOfURL: url) 新: var parser = NSXMLParser(contentsOfURL: url)! |
P.217 NSXMLParserDelegateプロトコル | 旧:optional func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI namespaceURI: String, qualifiedName qualifiedName: String, attributes attributeDict: [NSObject : AnyObject]) 新: optional func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) |
P.218 NSXMLParserDelegateプロトコル | 旧:optional func parser(parser: NSXMLParser, foundCharacters string: String) 新: optional func parser(parser: NSXMLParser!, foundCharacters string: String!) |
P.219 NSXMLParserDelegateプロトコル | 旧:optional func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI namespaceURI: String, qualifiedName qName: String) 新: optional func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) |
P.223 下 ソースコード6行目 | 旧:var url = NSURL(string: urlString) 新: var url = NSURL(string: urlString)! |
P.224 NSJSONSerializationクラス | 旧:class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions, error error: NSErrorPointer) -> AnyObject? 新: class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions, error: NSErrorPointer) -> AnyObject? |
P.229 ソースコード3行目 | 旧:var url = NSURL(string: newsUrlString) 新: var url = NSURL(string: newsUrlString)! |
P.232 ソースコード下から4行目 | 旧:cell.textLabel?.text = entry["title"] as? String 新: cell.textLabel.text = entry["title"] as? String |
P.238 中 ソースコード下から4行目 | 旧:var url = NSURL(string: self.entry["link"] as String) 新: var url = NSURL(string: self.entry["link"] as String)! |
P.251 下 SLComposeViewControllerクラス | 旧:init(forServiceType serviceType: String!) -> SLComposeViewController 新: init!(forServiceType serviceType: String!) -> SLComposeViewController |
P.261 下 ソースコード下から3行目 | 旧:let url = NSURL(string: newsUrlString) 新: let url = NSURL(string: newsUrlString)! |
P.268 UIImageクラス | 旧:init(named name: String) -> UIImage 新: init?(named name: String) -> UIImage |