この記事は、
ことを目的としたチュートリアルの後編です。
プログラミング言語Swift日本語チュートリアル ~ 前編(Apple公式ドキュメントSwift Tour±α) - こんにゃくマガジンと併せてApple公式ドキュメント
The Swift Programming Language: A Swift Tour相当(翻訳ではないです)±αな内容になっています。
前編の内容は、開発ツールのインストール、開発ツールの基本的な使い方、Swift言語の変数、定数、制御構文、オプショナル値、関数の定義と呼び出しについてです。
SwiftでのiOSアプリ開発 - はじめの一歩
iPhone上のボタンを押すと押した回数が表示されるアプリを作ってみます
プロジェクトを用意
GUIパーツの配置
- 左カラムのMain.storyboardをクリック
- 真ん中カラムにiPhoneの画面的なものが出てくる
- 右カラム下をスクロールしてLabelを探す > Labelを真ん中カラムのView Controllerの中にドラッグ&ドロップ
- 右カラム下をスクロールしてButtonを探す > Buttonを真ん中カラムのLabelドロップ位置周辺にドラッグ&ドロップ
GUIパーツとコードの結びつけ
- ウインドウ右上に四角いアイコンが6個あるうちの左から2個目(マウスオーバーするとShow the assistant editorとなる)をクリック
- 画面が分割され、左側はiPhone画面的なもの、右側はコードエディターになる
- controlを押しながらiPhone画面的なものにあるLabelをドラッグ > 右側コードのclass定義の内側一番下にドロップ > 出てきたダイアログのNameにlabelと入力 > connectクリック
- controlを押しながらiPhone画面的なものにあるButtonをドラッグ > 右側コードのclass定義の内側一番下にドロップ > 出てきたダイアログで下記入力 > connectクリック
- connection : Actionを選択
- Name : countUpと入力
- Argument : Noneを選択
- その他はいじらずにそのまま
Swiftコードの記述
- countUpの上に追加するコード
var count = 0
- countUp内に追加するコード
self.count += 1 self.label.text = String(self.count)
動作確認
- ウインドウ左上の再生ボタンを押す
- ビルドが成功するとiOSシミュレーターが起動する
- ビルドが失敗すると、エラーになったところが赤く表示されるので直しましょう
- Buttonを何回かクリックしてみる
- クリックするたびにLabelの文字がカウントアップされましたか?
SwiftでのiOSアプリ開発で、GUI作成は従来のObjective-Cを使った方法と基本的には同じなので、さらに深めたい方は書籍などを読んで進めて下さい。
私は初心者でしたので、こちらの書籍を買って勉強しました。
絶対に挫折しない iPhoneアプリ開発「超」入門【iOS7対応】増補改訂版
- 作者: 高橋京介
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/01/28
- メディア: 大型本
- この商品を含むブログを見る
クラスの定義 - init/deinitと継承
クラスはコード中で常に参照渡しされる(構造体との重要な違い)
class FoodMenuItem { var discountRate: Int? = 0 var name: String init(name: String) { self.name = name } func discountMessage() -> String { return "No discount" } } class Pizza: FoodMenuItem { var sauce: String init(sauce: String, name: String) { self.sauce = sauce super.init(name: name) discountRate = 5 } override func description() -> String { return "Pizza \(name) is discounted \(memberDiscountRate)%" } }
クラスの定義 - setter/getter
class MenuItem { var price: Int let taxRate = 1.08 var taxedPrice: Int { get { return price * taxRate } set { price = newValue / taxRate } } } class PizzaBeerSet { var pizza: Pizza { willSet { if (2000 < pizza.price + beer.price) pizza.discountRate = 10 } } } var beer: Beer { willSet { if (2000 < pizza.price + beer.price) pizza.discountRate = 10 } } } init(pizza: Pizza, beer: Beer) { self.pizza = pizza self.beer = beer } }
- プロパティーにgetterやsetterを持たせることが出来る
- setterの中で、新しい値には暗黙の名前newValueがある
- setの後の括弧中に明示的に名前を与えることも出来る
- didSetで指定したコードは、新しい値をセットする直前に実行される
- willSetで指定したコードは、新しい値をセットした直後に実行される
構造体
構造体はコード中で常にコピー渡しされる(クラスとの重要な違い)
struct PastaDrinkSet { var pasta: Past var drink: Drink func description() -> String { return "set of \(past.description()) and \(drink.description())" } } let recommendSet = PastaDrink(pasta: .Three, drink: .Beer) let threeOfSpadesDescription = threeOfSpades.simpleDescription()
列挙
enum PastaType: String { case Tomato = "tomato" case Cream = "cream" case GarlicOil = "garlic oil" func sauceName() -> String { switch self { case .GarlicOil: // selfの値がPastaTypeであることが既知なので、短縮形の.GarlicOilによって列挙値が参照されている return self.toRaw() default: return self.toRaw() + "sauce" } } } let calbonaraType = PastaType.GarcliOil // 定数に明示的な型がないので、フルネームによって列挙メンバーが参照されている let VongoleRossoTypeRaw = PastaTape.Tomato.toRaw()
ジェネリクス
func lastItem<ItemType>(items: Array<ItemType>) -> ItemType { return items[items.count - 1] } lastItem(["Newton", "New York", "Snow White"]) lastItem([4, 6, 8, 9]) class SequencePair<T1, T2 where T1: Sequence, T2 : Sequnce, T1.GeneratorType.Element == T2.GeneratorType.Element> { items1 : itemsType1 items2 : itemsType2 public commonItems() -> Array<T1.GeneratorType.Element> { var itemExistsInItems1 = Dictionary<T1.GeneratorType.Element, Bool>() for item in items1 { itemExistsInItems1[item] = true } for item in items2 { itemExistsInBoth[item] = true } return itemExistsInBoth.keys } }
Web上のテキストコンテンツを取得する
let url = NSURL(string: "http://api.tiqav.com/search/random.json") let request = NSURLRequest(URL: url) let response = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil) let response_body :String = NSString(data: response, encoding: NSUTF8StringEncoding) println(response_body)
- NSURLでURLオブジェクトを作る
- NSURLRequestでリクエストを作る
- NSURLConnection.sendSynchronousRequestでリクエストを送る
- レスポンスをStringとして取得する
Web上の画像データを取得する
let imageURL = NSURL(string: "https://devimages.apple.com.edgekey.net/swift/images/swift-hero.png") let imageData = NSData(contentsOfURL: imageURL)
ちょっと進んだSwiftでのiPhoneアプリ開発
画像URLを入力してその画像を表示するアプリを作ってみます。
ついでに少しだけデバッグ手法も使います。
- Xcode 6 betaを起動する
- メニュー:File > New > Project
- テンプレート選択ダイアログ: ①左枠iOS直下のApplication > ②右枠のSingle View Application > ③Next
- オプション選択ダイアログ
- 保存場所ダイアログ:どこでもよいがとりあえず左側のDocumentをクリック > Create
GUIパーツの配置
- 左カラムのMain.storyboardをクリック
- 真ん中カラムにiPhoneの画面的なものが出てくる
- 右カラム一番下の検索ボックスにtextと入力 > TextFieldを真ん中カラムのView Controller内左下にドラッグ&ドロップ
- 右カラム一番下の検索ボックスにbutと入力 > Buttonを真ん中カラムのView Controller内右下にドラッグ&ドロップ
- + 右カラム一番下の検索ボックスにimaと入力 > Image Viewを真ん中カラムのView Controller内上の方にドラッグ&ドロップ
GUIパーツとコードの結びつけ
- ウインドウ右上に四角いアイコンが6個あるうちの左から2個目(マウスオーバーするとShow the assistant editorとなる)をクリック
- 画面が分割され、左側はiPhone画面的なもの、右側はコードエディターになる
- controlを押しながらiPhone画面的なものにあるUIImageViewをドラッグ > 右側コードのclass定義の内側一番下にドロップ
- controlを押しながらiPhone画面的なものにあるText Fieldをドラッグ > 右側コードのclass定義の内側一番下にドロップ > 出てきたダイアログのNameにlabelと入力 > connectクリック
- controlを押しながらiPhone画面的なものにあるButtonをドラッグ > 右側コードのclass定義の内側一番下にドロップ > 出てきたダイアログで下記入力 > connectクリック
- connection : Actionを選択
- Name : showImageと入力
- Argument : Noneを選択
- その他はいじらずにそのまま
Swiftコードの記述
- viewDidLoad内に追加するコード
textField.text = "https://devimages.apple.com.edgekey.net/swift/images/swift-hero.png"
- showImage内に追加するコード
let imageURL = NSURL(string: textField.text) println("start fetch: " + textField.text) let imageData = NSData(contentsOfURL: imageURL) println("finish fetch: " + textField.text) imageView.image = UIImage(data: imageData)
編集後記
今までネット上の技術ドキュメントに関しては完全なROMでしたが、
少しずつでも皆さんに恩返しをして行かなければと思っていたところ、
今回、よい機会を得てこのチュートリアルをポストすることが出来ました。
至らない点も沢山あると思いますが、よろしくお願いします。
*1:抽象クラスやインターフェースのようなもの