【swift】 それ、enumとstructでやってみましょう!!

53
それ、enumstructやってみましょう!!

Upload: yu-tanaka

Post on 19-Jul-2015

455 views

Category:

Technology


3 download

TRANSCRIPT

それ、enumとstructでやってみましょう!!

自己紹介

株式会社サイバーエージェントにて、プーペガール・スマートフォン版ピグの開発に従事。

WebフロントエンジニアとしてUI設計、Flashでのアニメーション開発、ActionScriptでのプログラミング、HTML5ベースでのコーディング、Javascriptでのプログラミング・node.jsツール開発などを経て、昨年よりiOSエンジニアに転向。

現在株式会社アメスタにてSwiftをメイン言語として開発に携わっている。

本日のメニュー

• Swiftおさらい

• Swift の struct

• struct と class

• それ、structでやってみましょう!

• Swift の enum

• それ、enumでやってみましょう!

本日のメニュー

• Swiftおさらい

• Swift の struct

• struct と class

• それ、structでやってみましょう!

• Swift の enum

• それ、enumでやってみましょう!

Swift おさらい

Swift の特徴

・書式がわかりやすい

・オプショナルとか使う

・型推論してくれる

・ジェネリクスとかタプルとか

・Playgroundが使える

・コンパイルが遅い

・ググると車が出てくる

• Swiftおさらい

• Swift の struct

• struct と class

• それ、structでやってみましょう!

• Swift の enum

• それ、enumでやってみましょう!

本日のメニュー

Swift の struct

Objective-C の struct

・初期化

定義する

プロパティに値を格納

Swift の struct

Swift の struct・初期化

定義する

定義にinitializerを含むことができる

インスタンス生成=初期化

Swift の struct

Swift の struct・初期化

引数付きinitializerも作れる

インスタンス生成楽!

Swift の struct

Objective-C の struct

・処理

関数定義

hogeから呼び出し

Swift の struct

Swift の struct・処理

関数を含める事ができるので、判定や値の変換などデータに関わる処理をまとめる事ができる&使い回せる

関数定義

インスタンスに対して呼び出し

• Swiftおさらい

• Swift の struct

• structと class

• それ、structでやってみましょう!

• Swift の enum

• それ、enumでやってみましょう!

本日のメニュー

structと class

• classプロパティやメソッド(関数)をまとめて定義するもの。

• struct複数の変数をまとめて定義し、カプセル化するもの。

主にデータをまとめて保持する為のもの。

Swiftだと class も structもあまり見た目かわりませんが、、なにが違うのでしょう??

• 大きな違い

structと class

structは継承を行えない。class インスタンスは参照型であり structは値型↓

• Swiftおさらい

• Swift の struct

• structと class

• それ、structでやってみましょう!

• Swift の enum

• それ、enumでやってみましょう!

本日のメニュー

structは色々面倒だと思ってたのでclass使ってました。。。

structは色々面倒だと思ってたのでclass使ってました。。。

◆問題点

・そもそもデータはデータとして扱うべき!!

・また余計なクラスファイルが、、、

・コピーにいちいち新しくインスタンス作って必要なプロパティを代入せねば、、、

・今後言語仕様が変わったらどうしよう、、、ex) せっかく structで便利な機能出たのにうちは class 使ってるからダメだ、、

structは色々面倒だと思ってたのでclass使ってました。。。

◆問題点

・そもそもデータはデータとして扱うべき!!

・また余計なクラスファイルが、、、

・コピーにいちいち新しくインスタンス作って必要なプロパティを代入せねば、、、

・今後言語仕様が変わったらどうしよう、、、ex) せっかく structで便利な機能出たのにうちは class 使ってるからダメだ、、

それ、structでやってみましょう!

structでちゃんとデータとして定義!

思ったよりクラスライクに書ける★

◆注意点・プロパティを変更する関数にはmutating 属性を付与!structはカプセル化されているので、「変更するよ!」という宣言をしてあげる・格納する変数は varに!structはインスタンスが定数の時、プロパティを変更することができません。

でもちょっとだけ注意!

structを使うと構造も分かりやすく書ける!①

Controllerクラスファイル

struct A 実装

class実装

Controllerクラスファイル

class実装

データAクラスファイル

class実装

structファイル

struct B 実装

struct C 実装

データBクラスファイル

class実装

class(データ)実装

classが混在…

classがいっぱい…

◆Before ◆After

structを使うと構造も分かりやすく書ける!②

ViewControllerクラスファイル

class実装・viewとモデルの関連

モデルクラスファイル

class実装・データの生成、複製、削除 = データ管理・データの集合に関する処理

struct実装・データ自体に関する処理

Storyboard

View実装

クラス同様に処理を盛り込めるので、データ自体に関する処理は

structにガンガン盛り込めます!シンプル!!

structを使うと構造も分かりやすく書ける!②(ぞうさんver)

ElephantViewController.swift

class実装・画面にリスト分のぞうさんを描画

ElephantModel.swift

class実装・プロパティとしてぞうさんのリストを保持・ぞうさんを生成してリストに追加する関数・ぞうさんをコピーしてリストに追加する関数・リストにいるぞうさんの体重を増やす関数

struct実装・ぞうさんの体重と高さを保持・ぞうさんの体重を増やす関数

Elephant.xib

ぞうさんの絵

やった!!上手にぞうさん structを定義できたぞ!!!

次は黄色のぞうさんを定義するぞ!!

あれ、、structって継承できないんだっけ?ぞうさんstructのサブクラス的なのつくれない!?

こんな事をやりたかったのですが、、、

黄色ぞうさんは高さがぞうさんの2倍になるのです!!

基本はぞうさんと同じですが・・・

結論: structでは継承ができません!!!

そもそも、structとはつまりデータを格納するための型定義なので、

継承させるという考え方自体が少しおかしいかも。。

どうしよう・・・

結論: structでは継承ができません!!!

そもそも、structとはつまりデータを格納するための型定義なので、

継承させるという考え方自体が少しおかしいかも。。

やっぱりクラスかな・・・

結論: structでは継承ができません!!!

そもそも、structとはつまりデータを格納するための型定義なので、

継承させるという考え方自体が少しおかしいかも。。

やっぱりクラスかな・・・

待った!!

それ、enumでやってみましょう!

• Swiftおさらい

• Swift の struct

• struct と class

• それ、structでやってみましょう!

• Swift の enum

• それ、enumでやってみましょう!

本日のメニュー

Swift の enum

Enumとは?

関連させて扱いたい値を型としてまとめるもの。

色型 {

赤 = 0

青 = 1

黄 = 2

}

Swift の enum

Objective-C の enum

・初期化

定義する

変数に当て込み

Swift の enum

Swift の enum・初期化

定義する

変数に当て込み

Swift の enum

Swift の enum・初期化

定義に使う値の型を指定できる!

変数に当て込み

Objective-C の enum

・処理

関数定義

hogeから呼び出し

Swift の enum・処理

関数定義

インスタンスに対して呼び出し

Swift の enum・処理

クラスメソッドと同様のメソッドを作れる

自分自身の値を変更するメソッドも作れる

Swift の enum・処理

クラスメソッドの様にenumのメソッドを実行

インスタンスに対して実行すると自分自身が変わる

関数を含める事ができるので、enumの値に応じた関数を盛り込むことができる

• Swiftおさらい

• Swift の struct

• struct と class

• それ、structでやってみましょう!

• Swift の enum

• それ、enumでやってみましょう!

本日のメニュー

こんな事をやりたかったのですが、、、

黄色ぞうさんは高さがぞうさんの2倍になるのです!!

基本はぞうさんと同じですが・・・

こんな事をやりたかったのですが、、、

黄色ぞうさんは高さがぞうさんの2倍になるのです!!

基本はぞうさんと同じですが・・・

それ、enumでやってみましょう!

まずは ColorプロパティをElephant structに

組み込む!

考え方をデータ主体に変えてみると・・・

『黄色いぞうさん』 をクラスを使わずに表現するには、『ぞうさん』というデータに『色』というデータを持たせれば良い!

次に enumを定義し、『黄色いぞうさん』の時に高さが

2倍になるように表現してみる!

enumはクラスで処置が含まれる変数を定義するのと同じ様に

処理が含まれる変数を定義できる!

これを利用して色別にセットされる高さの比率を設定できた!

実際に普通のぞうさんと黄色のぞうさんの高さを

表現するとこんな感じ。

シ、シ、シンプル!!!

やった!!上手に黄色のぞうさんを表現できたぞ!!

この調子で各色ぞうさんが食事後に何キロ太るか表現してみよう!

ElephantColor enumに渡された食事数に対して何キロ太るか

計算する関数を追加する!

enum内の関数は各値のswitch分を含むのがスタンダードとなる。

また Swift は enumに対する switch 文に抜けているケースがあると

エラーを出してくれるので安心!(そして default がいらない!)

Elephant structに渡された食事数を enumの関数に引き渡し、結果をプロパティに格納する関数を定義する。

実際に普通のぞうさんと黄色のぞうさんの食事を

表現するとこんな感じ。

スィ、スィ、シンプル!!!

やった!!色んなぞうさんの食事後体重を表現できたぞ!

ちなみに enumを組み込むとしたらこんな感じ?(ぞうさんver)

ElephantViewController.swift

class実装・画面にリスト分のぞうさんを描画

ElephantModel.swift

class実装・プロパティとしてぞうさんのリストを保持・ぞうさんを生成してリストに追加する関数・ぞうさんをコピーしてリストに追加する関数・リストにいるぞうさんの体重を増やす関数

struct実装・ぞうさんの体重と高さを保持・ぞうさんの体重を増やす関数

Elephant.xib

ぞうさんの絵

enum実装・ぞうさんの色毎の処理

どうだったでしょう!?思った以上に structと enumで表現できてしまったと思いませんか!?

特に enumはこの他にも値に情報を持たせたり、Tupleを使って複雑にしたり、、色々できてしまいます!!!

でも時間がないので、本日はここまで。。

さあ!家に帰ったら早速・・・それ、enumとstructで

やってみましょう!!

ご清聴ありがとうございました。

http://qiita.com/uin010bm

uin010bm

Qiita