作って学ぶSwift/iOSアプリ入門

AppleがWWDC2014にてSwiftを発表してから2ヶ月近くが経ちました。OS X/iOSのアプリ開発に存在するObjective-Cの壁は取り払われ、より多くの人に馴染みやすい言語として現れたSwiftはコミュニティへの新たな開発者の流入を促し既存の開発者にもより安全でモダンなスタイルでの開発を可能にした点でとても歓迎されています。

既に沢山の入門文献や言語の特徴的な振る舞いを解説した文章が日本語で世に出回っていることは承知の上でありますが、最近のbeta 3で変更になった部分やこの2ヶ月で溜まってきたナレッジをもとにあらためて言語からアプリ開発まで一貫した解説記事を残したいと思いました。

本記事の構成はまず速習Swiftで文法の基礎的なところを話し、その後Todoアプリの作成を通じてクラスや構造体、UIKitを用いたアプリ制作の具体的な話をしていきます。読者は他言語を多少触ったことがある人を想定しているので行間が空いている箇所も多いとは思いますが最後までお付き合いいただければ幸いです。

速習Swift

公式にA Swift Tourという完成されたチュートリアルがありますが、英語で書かれているのであらためて日本語でSwiftの基本的な文法を解説してみたいと思います。文章より実際のコードを多めに書いているのでPlaygroundを片手に実際に動かしながら読んでいただけると理解も早いと思います。

まずはお決まりのHello Worldから始めましょう。こんにちは世界!

println("Hello World")

変数と型

Swift には変数と定数があります。それぞれvarletで宣言しvarで宣言されたものは変数、letで宣言されたものは定数になります。定数は一度値を代入すると二度と変更することは出来ません。

これだけ見るとIntString等の型がないように見えますが実際はコンパイラが自動的に解釈してくれていて変数と定数にもちゃんと型があります。例えば

変数に型が違う値を代入しようとするとコンパイルエラーになります。明示的に型を宣言する時は

このように名前の後に型を書きます。基本的な型を以下に列挙します。

ArrayとDictionaryには便利なリテラルが用意してあります。

辞書のリテラルに使われる括弧が{}ではなく[]であることに注意して下さい。あえて型を表記すると

このようになります。

複数の既存の型を組み合わせてタプルという特殊な型を作ることが出来ます

タプルを作るときは()の中にカンマ区切りで値を入れます。上記の例でlangの型は(String, Int)です。
3つ以上の型を組み合わせたり、タプルを入れ子にすることも出来ます。

値を取り出す時は.0の様に先頭から.0,.1,.2とアクセスします。
さらに値に名前をつけることも可能です。(2014/08/04 修正)

制御構文

Swift のif文は条件式の括弧をつけてもつけなくても構いません

同様にwhile文も括弧を省略することができます。

for 文にはいくつかの書き方があります。よく見かけるfor文から始めましょう

for文もまた括弧を省略できます

for inループも用意されています

以上3つは全て同じ結果になります。

0...9はRangeという構造体で詳しくは説明しませんがとりあえずは連続した値をもった配列という認識でいいと思います。もちろん配列もfor inループを使って回すことが出来ます

要素だけでなくインデックスも同時に取り出したい時はenumerate関数を使います

辞書もfor文で回すことが出来ます

実は配列や辞書はSequenceというプロトコルを持っていて、このプロトコルをもっているデータ構造であればなんでもfor inループで回すことが出来ます。Rangeやenumerate関数の返り値も同様にSequenceに適合しています。
参考: Sequence

Optional

Swiftには何もないことを示す値としてnilが存在します。
しかし通常のIntStringといった型に直接代入することは出来ません。
nilを扱うためにはOptionalという特殊な型で今ある型を包んでやる必要があります。

Int?Optionalの糖衣構文になっていて、既存の型の最後に?をつけることで簡単になんでもOptional型に変えることが出来ます。しかしこのままではOptional型なので普通のInt型のように扱うことが出来ません。

Optional型から元の型に戻す一番簡単な方法は!をつけることです。

!は文字数も少なく便利なのですがこれでは万が一nnilが入っていた時にランタイムエラーになってしまってせっかくのOptional型の恩恵を受けられません。より安全に計算を行うためにはif文をうまく使うことが出来ます。

もしmaybenilならifのブロック自体が実行されません。

実際にOptional型を使う場面として検索関数はとてもいい例になります。

ここでindexOf関数は文字列の配列から与えられた文字列を検索し、存在すればそのインデックスを、無ければnilを返すような関数です。
これを使えば

こんな風に安全な検索処理を書くことが出来ます。


indexOf 関数で\()を使って文字列の中にindexの値を入れています。
\()を使うとPrintableプロトコル適合した型の変数の値を直接文字列に埋め込むことができます。
参考: Printable


関数

まずは基本的な関数の書き方です。

doubleValueInt型の値を受け取ってInt型の値を返す関数です。型はInt -> Intになります。矢印の表記は左を定義域、右を値域と考えると数学の表記と対応していて見やすいですね。返り値がない場合は関数を定義する時に->を省略することが出来ます。

say関数の型は実際にはString -> Voidとなっています。

タプルとパターンマッチを組み合わせれば複数の値を返すことも出来ます

... を使えば可変長引数を扱えます。

names はStringの配列になります。

関数は値のように扱うことも出来ます。(クロージャと呼ばれます)

この場合、型を明記すると以下のようになります

クロージャの中の式が一つだけの時はreturnを省略できます

文脈上明らかな時はクロージャ内の型表記を省略することも出来ます

クロージャの引数には第一引数から初めて$0, $1, ...と名前が付いているので

とも書けます。ずいぶんシンプルになりましたね

関数の引数として関数を渡したり、関数の返り値として関数を返すことも出来ます

最後の例はカリー化を使って次のように書くことも出来ます

ここまで駆け足で基本的な文法を説明してきました。より詳しい内容が知りたい人にはA Swift Tourがオススメです。英語にはなりますがとても丁寧ですし公式なので一番正確な内容が書かれています。

これ以降は実践で学んで行きましょう。

Todoアプリを作る

ここからは実際にアプリを作りながら解説していきます。Appleの開発者登録している人はXcode6 beta を立ち上げてください。プロジェクトを新規作成し、iOS の Empty Application を作ってください。言語等はSwift用に設定しましょう。ProductionName は TodoApp としておきます

こんな感じのフォルダ構成になっていれば大丈夫です

オブジェクトとクラス

いちばん単純なクラスは

このように書きます。ちなみにこれでコンパイルも通ります。
これだけでは少し寂しいのでプロパティもつけましょう

さらにメソッドもつけましょう

作ったクラスから実際にインスタンスを生成する時は

このように関数呼び出しのようにクラス名の後ろに()をつけます。newalloc] init]を書く必要はありません。

クラスを継承をしたい時は

このようにクラス名に:を続けてさらに継承したいクラス名を書きます。新たに加えるプロパティやメソッドは通常のクラスと同じように書いていきますが、親クラスのメソッドをオーバーライドする時は

このように関数名の前にoverrideと書きます。継承クラスでのオーバーライドはコードを読みにくくすることも多いのでひと目で分かるような仕組みがあるのはとてもありがたいですね。

それではTodoアプリの方に戻りましょう。TodoTableViewController.swiftというファイルを作ってください。最初の画面を作るためにUIViewControllerを継承したTodoTableViewControllerというクラスを作ります。

上のコードではviewDidLoadメソッドをオーバーライドして更にsuper.viewDidLoad()で親クラスのviewDidLoadメソッドを呼び出しています。

TodoTableViewControllerを実際に表示してみましょう。AppDelegate.swiftを開いて以下のように書き換えてください。

おそらく追加したのは

の1行だと思います。TodoTableViewControllerのインスタンスをself.window!rootViewControllerプロパティに代入していますね。もちろんself.windowはOptional型として宣言されているので使う時は!をつけてやる必要があります。この行でアプリが起動して最初に表示される画面をTodoTableViewControllerに設定しています。しかし現時点で起動することはできますが何もない真っ白な画面が表示されるだけです。この真っ白な画面にUI部品を配置していくためにTodoTableViewController.swiftに戻りましょう。最初は文字を表示してみます。

追加した三行では

  • UILabel のインスタンスを生成してtitleに束縛する
  • titletextプロパティに”Todoリスト”という文字を入れる
  • TodoTableViewControllerviewプロパティにtitleaddSubviewする

ということをしています。とりあえず実行してみると画面に文字が表示されるでしょう。UI部品を表示する時はUIViewのオブジェクトを作ってaddSubviewするのが基本になるので覚えておいてください。

次は画像を表示してみましょう。以下の画像をheader@2x.pngという名前で保存してください。

そしたらFinderからXcode上のImages.xcassetsにドラッグ&ドロップ。これで作業は完了です。

TodoTableViewController.swiftに戻ってviewDidLoadに以下のコードを加えます

追加した三行は

  • まず画面の左上に320×64の大きさでUIImageViewを作る
  • “header”という名前の画像を追加する(実際には”header@2x.png”が使われます)
  • 画面に表示する(表示されているViewに追加する)

ということをしています。

タイトルとヘッダーをまとめてみましょう

タイトルを直接self.viewに追加するのではなく、まずheaderに追加してからheaderself.viewに追加することで表示しています。こうすることでヘッダーを移動させるときもheaderだけ動かせばtitleも自動的についてくるようになります。

それではTODOを表示するためのテーブルを追加していきましょう

なかなかコードが増えてきましたね。追加したのは

の2箇所です。まずtableViewをプロパティとして宣言しています。この時点では初期値を代入できないので型をOptional型にしています。こうすることで初期値としてnilが入るようになります。次に画面の高さを取得してUITableViewのインスタンスを作成しています。

UITableViewの動作を理解するためにプロトコルの概念が必要不可欠なのでここで説明しておきましょう。プロトコルはそのクラス(もしくは構造体)がどのように振る舞うのか、どのようなプロパティ・メソッドを持っているのかを宣言するためのものです。具体的には以下のように書きます

使い方は

こんな感じです。SomeClassSomeProtocolに適合することでsomeMethodを持っていることが保証されます。プロトコルは継承と違って一つのクラスにいくつも持たせることができるので振る舞いを宣言するのにとても便利な道具です。ちなみにプロトコルに適合させる文法は継承と同じになっていますが、継承とプロトコルを同時に使いたい時は

このように親クラスを先に書いてカンマ区切りでプロトコルを続けて書いていきます。

TodoTableViewController.swift に戻りましょう。

TodoTableViewControllerUITableViewDataSourceのプロトコルを追加します。このプロトコルが要請するのは

この2つのメソッドです(それ以外は@optional)。まずは適当に実装してみましょう。

tableView(_:numberOfRowsInSection:)では表示するテーブルの行数を返しています。
tableView(_:cellForRowAtIndexPath:)では表示するセルを生成して返しています。

それではviewDidLoadを仕上げましょう

追加したのはデータソースを設定した行とaddSubviewの行です。実行してみてください。ちゃんとtodoと書かれたテーブルが表示されましたでしょうか?とりあえず現時点でのコードを見てみましょう。

次にTODOデータを表現するデータ構造を作っていきます。TodoDataManager.swiftというファイルを新しく作ってください。

まずTODOのデータ構造を定義します

これは構造体と呼ばれるもので、クラスとほとんど同等の機能を持ちますが大きな違いは値渡しと参照渡しの違いです。構造体は値渡しなので変数に代入されるときにまるまるコピーされるのに対してクラスはその参照だけがコピーされます。大きく複雑なデータを扱うのには向きませんが、今回のTODOのようなデータは構造体にしたほうが扱いやすいでしょう。
参考: Class and Structures

これを使ってTODOリストを表現するデータ構造を作ります

initは特殊なメソッドで初期化の際に使われます。

initは重要な概念ですが解説すると長くなりそうなので今回は割愛させていただきます。
参考: Initialization

TodoDataManagerに基本的な機能を追加していきましょう。まずは生成・更新・削除が出来るようにしてみます。

追加したのは以下の四つのメソッドです。

validateメソッドはtodoが正しい書式かどうかを判定するメソッドで、値がnilでないかと空文字でないかを判定しています。これはクラスメソッドとして定義されていて、見て分かるようにクラス名から直接呼び出すのでインスタンスに依存すること無く使える関数です。createupdateremoveがそれぞれself.todoListの内容を生成・更新・削除するメソッドになっています。

肝心のTodoDataManagerからデータを読み出す機能を実装しましょう

sizeプロパティは現在格納されているTODOの総数を返します。少し変わった書き方をしていますが、これはComputed Propertyと呼ばれるものでそのプロパティに値を代入する時と値を取り出すときに実行される処理を書くことができます。

上の例で set にある newValue は新たに代入される値を参照しています。
set 節を省略して書くことも出来ます。

setを省略した場合はプロパティに代入することができなくなり読み取り専用になります。
get のみの場合は get { } を省略することも出来ます

これで最初の形になりました。

subscript(index: Int) -> TODOTodoDataManager[]を使ってアクセスされた時の振る舞いを記述します。

まるで配列のように中身にアクセスが出来るようになりました。このsubscriptを実装していればどんなクラスや構造体であっても[]による振る舞いを追加することが出来ます。また[]の中にとる値の型もIntだけでなく任意の型を使うことが出来ます。

次にアプリ内にデータを保存してアプリを終了してもTODOが消えないようにしてみましょう。

初期化の際にNSUserDefaultsからデータを読み出す処理と保存するsaveメソッドを追加しました。NSUserDefaultsplistという形式を使ってアプリ内にデータを保存します。アプリを閉じてもデータは記録されたままでstandardUserDefaultsメソッドが返すオブジェクトからいつでも取り出すことができます。ただし独自に作った構造体をそのまま保存することはできないのでここではTODOのStringのみ保存するようにしています。

create, update, deleteからこのsaveメソッドを呼ぶようにしましょう。

これでデータに修正が加わるたびにちゃんと保存されるようになりました。

TodoDataManagerはTODOのデータを中央管理しているのでひとつのオブジェクトを色んな所で使いまわす必要が出てくると思います。そこで最後にこのクラスをシングルトンとして使えるようにしましょう

現状ではクラス変数を作ることができないので構造体変数を利用してシングルトンを実現しています。staticletの前につけることでそのプロパティが型に紐付いたものであることを表しています。こうしておけば

となりTodoDataManager.sharedInstanceで常に同じインスタンスを取り出すことが可能です。
参考: hpique/SwiftSingleton

以上でTodoDataManagerは完成です。完成したものがこちらです。

それではTodoDataManagerで管理しているTODOをTodoTableViewControllerのテーブルに表示するようにしてみましょう

TodoTableViewController.swiftを開いてください。
作っていく前に一つ新しい概念を使ってよりSwiftらしい書き方に変えてみましょう。

プロトコルの部分だけextensionで分離しています。extensionは既存の型に新たな機能をあとから付け加えることの出来る機能です。例えば

Int型でさえも後から拡張することが出来ます。これを利用してプロトコルが要請するメソッドの記述だけ分離しているわけですね。こうすることで実装を整理できプロトコルが後から付け加えられても見やすさを保つことが出来ます。

それではあらためてTodoDataManagerの内容を表示できるようにしていきましょう

これでTodoDataManagerで管理しているデータが表示されるはずです!しかし今はまだ何もデータが入っていないので何も表示されません。TODOを追加するUIを実装していきましょう

増えた箇所は

の2箇所です。userInteractionEnabledtrue にすることでheaderaddSubviewするボタンが正常に動くようにしています。buttonにはaddTargetでタップされた時に呼び出す関数をしていしています。しかしまだこのshowCreateView関数は存在していないので作っていきましょう。

これで追加ボタンを押すと Todoを追加 するという表示が出るようになったと思います。
参考: UIAlertController

このままだと入力ができないのでテキストフィールドを追加しましょう

self.alertUITextField を追加して入力が終わったらtextFieldShouldEndEditingが呼び出されるようにしました。ここらへんはプロトコルをうまく利用しています。textFieldShouldEndEditingでは入力値をもとに新たにTODOを作成して登録したあとself.alertを閉じています。

これで新たなTODOを追加していけるようになりました。次に編集と削除が出来るようにしてみましょう。編集と削除のボタンはそれぞれのTODOのセルにあったほうが自然なのでそのセル自体を作っていきます。TodoTableViewCell.swiftというファイルを作りましょう。

UITableViewCellを継承したTodoTableViewCellというクラスを作ります。iPhoneに標準で入ってるリマインダーのようにスワイプしたら編集・削除ボタンが出てくるような仕組みを作ってみましょう

いきなりたくさん書きましたが一つずつ説明していきます。まずinit(style: UITableViewCellStyle, reuseIdentifier: String!)では親クラスのsuper.init(style: style, reuseIdentifier: reuseIdentifier)を呼び出しています。self.selectionStyle = .Noneでタップされた時の挙動を何もしないように設定しています。.Noneは正確に書くとUITableViewCellSelectionStyle.NoneUITableViewCellSelectionStyleという列挙子の一つを表しています。この場合は左辺がUITableViewCellSelectionStyle型のプロパティであり文脈上明らかなので省略して.Noneとだけ書くことが出来ます。

まずcontentViewの背景色を白にしています。

ここではGestureRecognizerの生成と登録を同時に行っています。UISwipeGestureRecognizerは右方向へのスワイプを認識するためのものでこの場合contentView上で右方向へのスワイプが行われるとhideDeleteButtonメソッドが実行されます。

これは左方向へのスワイプが行われるとshowDeleteButtonメソッドが実行されるようにしています。

showDeleteButtonの中を見て行きましょう。

まずself.haveButtonsDisplayedの真偽値で開いた状態か閉じた状態かを判断しています。そのあとUIView.animateWithDurationでアニメーション後の状態を指定して0.1秒で動くようにしています。こうすることで今の状態からアニメーション後の状態に向かって0.1秒で変化するように自動的に計算してくれます。アニメーションが完了したらself.haveButtonsDisplayed = trueでボタンが表示された状態であるように値を更新しています。hideDeleteButtonの中ではこれと反対のことをしています。

それでは編集・削除ボタンを表示してみましょう。

init(style: UITableViewCellStyle, reuseIdentifier: String!)の中で描画に関する部分をcreateViewに切り出しています。

このままだとボタンが押されても何も動作しないのでTODOを編集・削除する機能をupdateTodo, removeTodoに実装していきたいのですがTodoTableViewCellTodoDataManagerのインスタンスを持っておらずどうすればいいかわかりません。TodoDataManagerはシングルトンなのでそれを取得すればいいのですがその後にテーブルを更新しなければならずそれはTodoTableViewCellの中ではなくTodoTableViewControllerの中で行う必要があります。このように動作を他のオブジェクトに”委譲”するような仕組みをデリゲートパターンといいます。今回はプロトコルを使ってデリゲートを実装してみましょう。

@optionalアノテーションをメソッドの前につけるとそのメソッド・プロパティは実装していても実装していなくても良くなります。ただし@optionalを使うには@objcアノテーションをprotocolの前につける必要があります。@objcアノテーションを付けたプロトコルはNSObjectNSProxyを継承したクラスにしか適用できなくなります。今の場合はUIViewControllerを継承したTodoTableViewControllerに適用しようとしてるので問題無いですね!

デリゲートとして使う変数は以下のように宣言しています。

weakはメモリ管理に関連するものでdelegateに入れられたオブジェクトのリファレンスカウントを増やさないようにするものです。
この場合はTodoTableViewCellTodoTableViewControllerを保持するようにするので循環参照を起こさないようにしています。
updateTodo, removeTodoが呼び出されるとそのままデリゲートオブジェクトのupdateTodo, removeTodoが呼び出されるようになっていますね。

以上でTodoTableViewCellは完成です。出来上がったコードはこちらです。

作ったTodoTableViewCellTodoTableViewControllerの方に反映させましょう(追記 2014/07/23)

最後にTodoTableViewControllerTodoTableViewCellDelegate用のメソッドを実装して編集・削除機能を実装しましょう。

ここに実装していくのですが、生成・編集・削除をうまく処理するためにそれぞれの状態であることを表現出来るようにします

このようにenumを追加してください。
これは

  • TodoAlertViewType.Create
  • TodoAlertViewType.Update
  • TodoAlertViewType.Remove

という3つの列挙子を作り、さらにUpdateRemoveにはそれぞれ編集・削除する対象のインデックスを連想値として持たせています。これを使って

このように実装していきます。方針は

  • alertType に生成・編集・削除のどれであるかを設定して
  • UIAlertController のインスタンスを生成して表示する

です。これに伴ってUITextFieldDelegateの実装を以下のように変更します。

これで全て完成しました。TodoTableViewController.swiftのコードはこちらです。
完成したTodoAppはGithubにあげています。読んだだけの人もぜひ実際に動かしてみてください。

Camphor-/TodoApp-Swift

あとがき

以上Swiftでのアプリ制作についてかなり飛ばし気味ではありましたが説明してきました。Swiftが発表されてから2ヶ月近く経とうとしていますが一番の情報源はやはり公式ドキュメントだと思います。しかし公式ドキュメントは英語なので英語が苦手だという方は、日本語だとQiitaが雑多な情報が集まっていてオススメです。

再び英語にはなりますがGithubにも既にたくさんのSwiftのプロジェクトがあるので実際にコードを読むととても勉強になると思います。自分も__.swiftというライブラリを公開しているので勉強ついでに覗きに来てもらえると幸いです。

Swiftで書いたアプリはまだApp Storeに申請することは出来ません。正式リリースは今年の秋をまたなければいけないでしょう。しかし今からSwiftを学んでおいて損は全くないと思います。長い解説記事になってしまいましたが最後まで読んでいただいてありがとうございました。これを機に一人でも多くSwift開発者が増えると幸いです。

ひろせ


作って学ぶSwift/iOSアプリ入門」への22件のフィードバック

  1. とおりすがり

    名前付きのタプルについて間違いがあるようです。
    ご確認ください。

    返信
  2. ImaGiga

    本日午後から楽しく拝見させて頂きました(個人的にはとてもエキサイティングな時間でした)。
    手順に従いTodoAppを最後まで実装してみました。
    私の読み落としかも知れませんが、カスタムセルの下記書き替えの記載が漏れているような気がしました。

    【初期実装】
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let row = indexPath.row
    let cell = UITableViewCell(style: .Default, reuseIdentifier: nil)
    cell.textLabel.text = self.todo[row].title
    return cell
    }
      ↓
    【カスタムセル対応の書き替え】
    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
    let cell = TodoTableViewCell(style: .Default, reuseIdentifier: nil)
    cell.delegate = self
    cell.textLabel.text = self.todo[indexPath.row].title
    cell.tag = indexPath.row
    return cell
    }

    大変参考になります、ありがとうございました。

    返信
  3. k23

    わかりやすい情報ありがとうございます。
    swiftの勉強に参考にさせていただいております。

    さて、Githubよりソースを入手させていただき、ビルドしているのですが、
    TodoDataManagerの var todoList: [TODO]の部分にて下記エラーがでており、
    ビルドできない状況になっております。

    Consecutive declarations on a line must be separated by ‘;’

    何か環境設定など必要なのでしょうか。差し支えなければ教えていただきたく。

    返信
    1. camphor- 投稿作成者

      ありがとうございます。あらためて手元で確認しましたが正常に動作しました。おそらくお使いになっているXcodeのバージョンが古いものではないでしょうか?現時点で最新の Xcode6 beta4 で試してみてください。

      返信
      1. k23

        ご返答ありがとうございます。
        アドバイスいただいた通り、手前の環境はXcode beta2でした。
        最新バージョンで確認してみたいと思います。ありがとうございました。

        返信
  4. kotan

    初心者です。勉強になります。下記の所、エラーとなりますが、
    ☆部分を挿入すればいいという事でしょうか。

    func add(x: Int) -> Int -> Int {
    func addX(y: Int) -> Int {
    return x + y
    }
    return addX //☆
    }
    let add10 = add(10)
    add10(5)
    // 15

    返信
  5. まいける

    非常にわかりやすいです、ありがとうございます!
    私の環境はxcode6 beta6なのですが、

    class TodoDataManagerの

    class func validate(todo: TODO!) -> Bool {
    return todo != nil && todo != “”
    }
    でエラーがでてしまい

    return todo != nil && todo.title != “”

    これで通りました、それと

    func create(todo: TODO!) -> Bool {
    if TodoDataManager.validate(todo) {
    self.todoList += todo
    self.save()
    return true
    }
    return false
    }
    は+=が使えなかったので(beta5からarrayの+=の仕様が変わっていましたがstructも??)

    self.todoList.append(todo)

    でいけました、あともう一点

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) ->
    cellForRowAtIndexPathを削除したらビルド通りました、ちょっと理由はまだわかりません

    beta4用の記事でしたら申し訳ございません

    返信
  6. あきたじゅん

    ものすごく参考になりました。
    Java プログラマな身にも分かりやすかったです。

    Github のほうで Xcode6 beta7 のプルリクが来ているようなので、取り込んでいただけますとありがたいです★
    (beta7 環境だと、コンパイルエラーに悩まされましたので)

    返信
  7. zak

    XcodeのバージョンアップでEmpty Applicationが選択できなくなったらしいので、そのあたりの対応もできればお願いします。

    返信
  8. junas

    Optional型説明の最後の部分に間違いがあるようです。
    ご確認ください。

    indexOf 関数で\()を使って文字列の中にindexの値を入れています。
    ↑indexOfではなくprintlnではないでしょうか?

    返信
  9. kitamura

    XCode6にはEmpty Applicationがないので、この記事が役にたたない。
    StoryBoard使ったやり方にかえてほしい。

    もちろんEmptyApplication作る方法あるけど、Appleが進めないやり方やっても
    あまり意味がないと思う。

    返信
  10. 井上陽水

    お元気ですか
    まじめに読んでいたら突然の「くうねるあそぶ」でめちゃうけましたw
    せっかくの良い記事なので正式版の内容にきちんと修正されてはいかがでしょうか、(配列の追加で、+=演算子が廃止になった点など)
    GitHubの修正されているようですが

    返信
  11. ピンバック: CAMPHOR- Advent Calendar 2014をまとめるよ! - CAMPHOR- Blog

  12. ピンバック: Apple新言語「Swift」ことはじめ。勉強用リンクまとめ。 | イリテク

  13. ピンバック: JavaScriptプログラマがSwift iOSアプリを2週間で作って公開してみた〜その2 Swift Programming for JavaScript Programmer〜 | てじーまーのblog

  14. ピンバック: 【文系エンジニア20歩目】8月2日『iOS開発難しいよ!!』 | devtheage

  15. ピンバック: Swift/iOSアプリ作成 | Otacky blog

  16. ピンバック: Swift/iOSアプリ作成 – Otacky blog

  17. ピンバック: Swift/iOSアプリ作成

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です