木下 誠
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 |