言語等はSwift用に設定しましょう。{}このように書きます。ちなみにこれでコンパイルも通ります。1このように関数呼び出しのようにクラス名の後ろに()をつけます。init]を書く必要はありません。{}このようにクラス名に:を続けてさらに継承したいクラス名を書きます。\(someInt)")}}このように関数名の前にoverrideと書きます。継承クラスでのオーバーライドはコードを読みにくくすることも多いのでひと目で分かるような仕組みがあるのはとてもありがたいですね。それではTodoアプリの方に戻りましょう。TodoTableViewController.swiftというファイルを作ってください。最初の画面を作るためにUIViewControllerを継承したTodoTableViewControllerというクラスを作ります。{super.viewDidLoad()}}上のコードではviewDidLoadメソッドをオーバーライドして更にsuper.viewDidLoad()で親クラスのviewDidLoadメソッドを呼び出しています。TodoTableViewControllerを実際に表示してみましょう。AppDelegate.swiftを開いて以下のように書き換えてください。TodoTableViewController()の1行だと思います。TodoTableViewControllerのインスタンスをself.window!のrootViewControllerプロパティに代入していますね。self.windowはOptional型として宣言されているので使う時は!をつけてやる必要があります。この行でアプリが起動して最初に表示される画面をTodoTableViewControllerに設定しています。現時点で起動することはできますが何もない真っ白な画面が表示されるだけです。この真っ白な画面にUI部品を配置していくためにTodoTableViewController.swiftに戻りましょう。最初は文字を表示してみます。インスタンスを生成してtitleに束縛するtitleのtextプロパティに”Todoリスト”という文字を入れるTodoTableViewControllerのviewプロパティにtitleをaddSubviewするということをしています。実行してみると画面に文字が表示されるでしょう。UI部品を表示する時はUIViewのオブジェクトを作ってaddSubviewするのが基本になるので覚えておいてください。次は画像を表示してみましょう。以下の画像をheader@2x.pngという名前で保存してください。したらFinderからXcode上のImages.xcassetsにドラッグ&ドロップ。これで作業は完了です。"Todoリスト"self.view.addSubview(title)}追加した三行はまず画面の左上に320×64の大きさでUIImageViewを作る“header”という名前の画像を追加する(実際には”header@2x.png”が使われます)画面に表示する(表示されているViewに追加する)ということをしています。"Todoリスト"header.addSubview(title)self.view.addSubview(header)}タイトルを直接self.viewに追加するのではなく、まずheaderに追加してからheaderをself.viewに追加することで表示しています。することでヘッダーを移動させるときもheaderだけ動かせばtitleも自動的についてくるようになります。60))self.view.addSubview(header)}なかなかコードが増えてきましたね。60))の2箇所です。tableViewをプロパティとして宣言しています。この時点では初期値を代入できないので型をOptional型にしています。することで初期値としてnilが入るようになります。次に画面の高さを取得してUITableViewのインスタンスを作成しています。UITableViewの動作を理解するためにプロトコルの概念が必要不可欠なのでここで説明しておきましょう。プロトコルはそのクラス(もしくは構造体)がどのように振る舞うのか、どのようなプロパティ・メソッドを持っているのかを宣言するためのものです。{println("Hello")}}こんな感じです。SomeClassはSomeProtocolに適合することでsomeMethodを持っていることが保証されます。プロトコルは継承と違って一つのクラスにいくつも持たせることができるので振る舞いを宣言するのにとても便利な道具です。Class")}}このように親クラスを先に書いてカンマ区切りでプロトコルを続けて書いていきます。実装は省略}TodoTableViewControllerにUITableViewDataSourceのプロトコルを追加します。UITableViewCell!この2つのメソッドです(それ以外は@optional)。適当に実装してみましょう。cell}}tableView(_:numberOfRowsInSection:)では表示するテーブルの行数を返しています。tableView(_:cellForRowAtIndexPath:)では表示するセルを生成して返しています。selfself.view.addSubview(self.tableView!)self.view.addSubview(header)}追加したのはデータソースを設定した行とaddSubviewの行です。実行してみてください。todoと書かれたテーブルが表示されましたでしょうか?とりあえず現時点でのコードを見てみましょう。cell}}次にTODOデータを表現するデータ構造を作っていきます。TodoDataManager.swiftというファイルを新しく作ってください。String}これは構造体と呼ばれるもので、クラスとほとんど同等の機能を持ちますが大きな違いは値渡しと参照渡しの違いです。構造体は値渡しなので変数に代入されるときにまるまるコピーされるのに対してクラスはその参照だけがコピーされます。大きく複雑なデータを扱うのには向きませんが、今回のTODOのようなデータは構造体にしたほうが扱いやすいでしょう。[]}}initは特殊なメソッドで初期化の際に使われます。Arrayinitは重要な概念ですが解説すると長くなりそうなので今回は割愛させていただきます。InitializationTodoDataManagerに基本的な機能を追加していきましょう。生成・更新・削除が出来るようにしてみます。true}}追加したのは以下の四つのメソッドです。Boolvalidateメソッドはtodoが正しい書式かどうかを判定するメソッドで、値がnilでないかと空文字でないかを判定しています。これはクラスメソッドとして定義されていて、見て分かるようにクラス名から直接呼び出すのでインスタンスに依存すること無く使える関数です。createとupdateとremoveがそれぞれself.todoListの内容を生成・更新・削除するメソッドになっています。実装省略}sizeプロパティは現在格納されているTODOの総数を返します。Propertyと呼ばれるものでそのプロパティに値を代入する時と値を取り出すときに実行される処理を書くことができます。新たに代入される値を参照しています。節を省略して書くことも出来ます。10setを省略した場合はプロパティに代入することができなくなり読み取り専用になります。10これで最初の形になりました。TODOはTodoDataManagerに[]を使ってアクセスされた時の振る舞いを記述します。ねるまるで配列のように中身にアクセスが出来るようになりました。このsubscriptを実装していればどんなクラスや構造体であっても[]による振る舞いを追加することが出来ます。[]の中にとる値の型もIntだけでなく任意の型を使うことが出来ます。次にアプリ内にデータを保存してアプリを終了してもTODOが消えないようにしてみましょう。実装省略}初期化の際にNSUserDefaultsからデータを読み出す処理と保存するsaveメソッドを追加しました。NSUserDefaultsはplistという形式を使ってアプリ内にデータを保存します。アプリを閉じてもデータは記録されたままでstandardUserDefaultsメソッドが返すオブジェクトからいつでも取り出すことができます。独自に作った構造体をそのまま保存することはできないのでここではTODOのStringのみ保存するようにしています。deleteからこのsaveメソッドを呼ぶようにしましょう。true}}これでデータに修正が加わるたびにちゃんと保存されるようになりました。TodoDataManagerはTODOのデータを中央管理しているのでひとつのオブジェクトを色んな所で使いまわす必要が出てくると思います。実装省略}現状ではクラス変数を作ることができないので構造体変数を利用してシングルトンを実現しています。staticをletの前につけることでそのプロパティが型に紐付いたものであることを表しています。変数の参照が同じかどうかを判定する演算子となりTodoDataManager.sharedInstanceで常に同じインスタンスを取り出すことが可能です。hpique/SwiftSingleton以上でTodoDataManagerは完成です。完成したものがこちらです。それではTodoDataManagerで管理しているTODOをTodoTableViewControllerのテーブルに表示するようにしてみましょうTodoTableViewController.swiftを開いてください。作っていく前に一つ新しい概念を使ってよりSwiftらしい書き方に変えてみましょう。実装省略}}プロトコルの部分だけextensionで分離しています。extensionは既存の型に新たな機能をあとから付け加えることの出来る機能です。8Int型でさえも後から拡張することが出来ます。これを利用してプロトコルが要請するメソッドの記述だけ分離しているわけですね。することで実装を整理できプロトコルが後から付け加えられても見やすさを保つことが出来ます。cell}}これでTodoDataManagerで管理しているデータが表示されるはずです!しかし今はまだ何もデータが入っていないので何も表示されません。.TouchUpInside)header.addSubview(button)の2箇所です。することでheaderにaddSubviewするボタンが正常に動くようにしています。buttonにはaddTargetでタップされた時に呼び出す関数をしていしています。このshowCreateView関数は存在していないので作っていきましょう。するという表示が出るようになったと思います。追加して入力が終わったらtextFieldShouldEndEditingが呼び出されるようにしました。ここらへんはプロトコルをうまく利用しています。textFieldShouldEndEditingでは入力値をもとに新たにTODOを作成して登録したあとself.alertを閉じています。これで新たなTODOを追加していけるようになりました。次に編集と削除が出来るようにしてみましょう。編集と削除のボタンはそれぞれのTODOのセルにあったほうが自然なのでそのセル自体を作っていきます。TodoTableViewCell.swiftというファイルを作りましょう。{}UITableViewCellを継承したTodoTableViewCellというクラスを作ります。}}}}いきなりたくさん書きましたが一つずつ説明していきます。reuseIdentifier)を呼び出しています。.Noneでタップされた時の挙動を何もしないように設定しています。.Noneは正確に書くとUITableViewCellSelectionStyle.NoneでUITableViewCellSelectionStyleという列挙子の一つを表しています。この場合は左辺がUITableViewCellSelectionStyle型のプロパティであり文脈上明らかなので省略して.Noneとだけ書くことが出来ます。UIColor.whiteColor()まずcontentViewの背景色を白にしています。"hideDeleteButton"))ここではGestureRecognizerの生成と登録を同時に行っています。UISwipeGestureRecognizerは右方向へのスワイプを認識するためのものでこの場合contentView上で右方向へのスワイプが行われるとhideDeleteButtonメソッドが実行されます。.Leftself.contentView.addGestureRecognizer(swipeRecognizer)これは左方向へのスワイプが行われるとshowDeleteButtonメソッドが実行されるようにしています。showDeleteButtonの中を見て行きましょう。}}まずself.haveButtonsDisplayedの真偽値で開いた状態か閉じた状態かを判断しています。そのあとUIView.animateWithDurationでアニメーション後の状態を指定して0.1秒で動くようにしています。することで今の状態からアニメーション後の状態に向かって0.1秒で変化するように自動的に計算してくれます。trueでボタンが表示された状態であるように値を更新しています。hideDeleteButtonの中ではこれと反対のことをしています。それでは編集・削除ボタンを表示してみましょう。String!)の中で描画に関する部分をcreateViewに切り出しています。removeTodoに実装していきたいのですがTodoTableViewCellはTodoDataManagerのインスタンスを持っておらずどうすればいいかわかりません。TodoDataManagerはシングルトンなのでそれを取得すればいいのですがその後にテーブルを更新しなければならずそれはTodoTableViewCellの中ではなくTodoTableViewControllerの中で行う必要があります。このように動作を他のオブジェクトに”委譲”するような仕組みをデリゲートパターンといいます。今回はプロトコルを使ってデリゲートを実装してみましょう。{delegate?.removeTodo?(self.tag)}}@optionalアノテーションをメソッドの前につけるとそのメソッド・プロパティは実装していても実装していなくても良くなります。@optionalを使うには@objcアノテーションをprotocolの前につける必要があります。@objcアノテーションを付けたプロトコルはNSObjectかNSProxyを継承したクラスにしか適用できなくなります。今の場合はUIViewControllerを継承したTodoTableViewControllerに適用しようとしてるので問題無いですね!デリゲートとして使う変数は以下のように宣言しています。TodoTableViewCellDelegate?weakはメモリ管理に関連するものでdelegateに入れられたオブジェクトのリファレンスカウントを増やさないようにするものです。この場合はTodoTableViewCellがTodoTableViewControllerを保持するようにするので循環参照を起こさないようにしています。removeTodoが呼び出されるようになっていますね。以上でTodoTableViewCellは完成です。出来上がったコードはこちらです。cell}最後にTodoTableViewControllerにTodoTableViewCellDelegate用のメソッドを実装して編集・削除機能を実装しましょう。実装省略}このようにenumを追加してください。これはTodoAlertViewType.CreateTodoAlertViewType.UpdateTodoAlertViewType.Removeという3つの列挙子を作り、さらにUpdateとRemoveにはそれぞれ編集・削除する対象のインデックスを連想値として持たせています。nil)}}このように実装していきます。インスタンスを生成して表示するです。これに伴ってUITextFieldDelegateの実装を以下のように変更します。true}}これで全て完成しました。TodoTableViewController.swiftのコードはこちらです。完成したTodoAppはGithubにあげています。読んだだけの人もぜひ実際に動かしてみてください。Camphor-/TodoApp-Swiftあとがき以上Swiftでのアプリ制作についてかなり飛ばし気味ではありましたが説明してきました。Swiftが発表されてから2ヶ月近く経とうとしていますが一番の情報源はやはり公式ドキュメントだと思います。公式ドキュメントは英語なので英語が苦手だという方は、日本語だとQiitaが雑多な情報が集まっていてオススメです。英語にはなりますがGithubにも既にたくさんのSwiftのプロジェクトがあるので実際にコードを読むととても勉強になると思います。自分も__.swiftというライブラリを公開しているので勉強ついでに覗きに来てもらえると幸いです。Storeに申請することは出来ません。正式リリースは今年の秋をまたなければいけないでしょう。今からSwiftを学んでおいて損は全くないと思います。長い解説記事になってしまいましたが最後まで読んでいただいてありがとうございました。これを機に一人でも多くSwift開発者が増えると幸いです。tv」で家のテレビの電源を付ける。AM名前付きのタプルについて間違いがあるようです。PMありがとうございます。PM本日午後から楽しく拝見させて頂きました(個人的にはとてもエキサイティングな時間でした)。手順に従いTodoAppを最後まで実装してみました。私の読み落としかも知れませんが、カスタムセルの下記書き替えの記載が漏れているような気がしました。cell}大変参考になります、ありがとうございました。PMありがとうございます。PMわかりやすい情報ありがとうございます。swiftの勉強に参考にさせていただいております。[TODO]の部分にて下記エラーがでており、ビルドできない状況になっております。‘;’何か環境設定など必要なのでしょうか。差し支えなければ教えていただきたく。PMありがとうございます。手元で確認しましたが正常に動作しました。PMご返答ありがとうございます。最新バージョンで確認してみたいと思います。ありがとうございました。