この記事は、
ことを目的としたチュートリアルの後編です。
Swift日本語チュートリアル ~ 前編(Apple公式ドキュメントSwift Tour±α) - こんにゃくマガジンと併せてApple公式ドキュメント
The Swift Programming Language: A Swift Tour相当(翻訳ではないです)±αな内容になっています。
前編の内容は、開発ツールのインストール、開発ツールの基本的な使い方、Swift言語の変数、定数、制御構文、オプショナル値、関数の定義と呼び出し、SwiftでのiOSアプリ開発はじめの一歩についてです。
原稿をGitHubで管理することにしました。間違いの訂正や古い情報の更新はプルリクエストして頂けると助かります。
knj4484/hateblo-xavier · GitHub
クラスの定義 - 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定義の内側一番下にドロップ > 出てきたダイアログのNameにimageViewと入力 > connectクリック
- controlを押しながらiPhone画面的なものにあるText Fieldをドラッグ > 右側コードのclass定義の内側一番下にドロップ > 出てきたダイアログのNameにtextFieldと入力 > 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)
コマンドラインでSwiftシェルを使う
~/.bash_profileに下記を追加しておく
PATH=/Applications/Xcode6-Beta.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH
Terminalを起動して、swiftコマンドを動かす
$ swift -sdk $(xcrun --show-sdk-path --sdk macosx) (略) Welcome to Swift! Type :help for assistance. 1>
Swiftプロンプトで何か実行してみる
1> println("Hello Swift!") Hello Swift! 2>
control + D で終了
-integrated-replオプションというのもあり、同じような使い方が出来る(違いはなんだろう?)
$ swift -integrated-repl -sdk $(xcrun --show-sdk-path --sdk macosx) Welcome to swift. Type ':help' for assistance. (swift) for i in 1..3 { println(String(i)) } 1 2
コマンドラインでSwiftファイルを処理する
-iオプションでコンパイル結果をそのまま実行
$ swift -i foo.swift
swiftコマンドにファイル名を渡して実行ファイルを作る
$ swift foo.swift $ ./foo
コマンドライン引数を使う
for i in 1..C_ARGC { let arg = String.fromCString(C_ARGV[Int(i)]) println(arg) }
$ swift -emit-executable try-arg.swift $ ./try-arg aaa bbb aaa bbb
編集後記
今までネット上の技術ドキュメントに関しては完全なROMでしたが、
少しずつでも皆さんに恩返しをして行かなければと思っていたところ、
今回、よい機会を得てこのチュートリアルをポストすることが出来ました。
至らない点も沢山あると思いますが、よろしくお願いします。
ところで、最近みなさんが欲しいものは何でしょうか?私はこの二つが気になっています(特に下のやつ)。
![★話題商品★ Oculus Rift Developers Kit / オキュラス リフト / 3D ヘッドマウントディスプレイ [米国正規品] ★話題商品★ Oculus Rift Developers Kit / オキュラス リフト / 3D ヘッドマウントディスプレイ [米国正規品]](http://ecx.images-amazon.com/images/I/41aExfphuuL._SL160_.jpg)
★話題商品★ Oculus Rift Developers Kit / オキュラス リフト / 3D ヘッドマウントディスプレイ [米国正規品]
- 出版社/メーカー: Oculus
- メディア: エレクトロニクス
- この商品を含むブログを見る
*1:抽象クラスやインターフェースのようなもの