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

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

Jul 19, 2015

Download

Technology

Yu Tanaka
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 【Swift】 それ、enumとstructでやってみましょう!!

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

Page 2: 【Swift】 それ、enumとstructでやってみましょう!!

自己紹介

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

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

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

Page 3: 【Swift】 それ、enumとstructでやってみましょう!!

本日のメニュー

• Swiftおさらい

• Swift の struct

• struct と class

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

• Swift の enum

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

Page 4: 【Swift】 それ、enumとstructでやってみましょう!!

本日のメニュー

• Swiftおさらい

• Swift の struct

• struct と class

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

• Swift の enum

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

Page 5: 【Swift】 それ、enumとstructでやってみましょう!!

Swift おさらい

Swift の特徴

・書式がわかりやすい

・オプショナルとか使う

・型推論してくれる

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

・Playgroundが使える

・コンパイルが遅い

・ググると車が出てくる

Page 6: 【Swift】 それ、enumとstructでやってみましょう!!

• Swiftおさらい

• Swift の struct

• struct と class

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

• Swift の enum

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

本日のメニュー

Page 7: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の struct

Objective-C の struct

・初期化

定義する

プロパティに値を格納

Page 8: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の struct

Swift の struct・初期化

定義する

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

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

Page 9: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の struct

Swift の struct・初期化

引数付きinitializerも作れる

インスタンス生成楽!

Page 10: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の struct

Objective-C の struct

・処理

関数定義

hogeから呼び出し

Page 11: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の struct

Swift の struct・処理

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

関数定義

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

Page 12: 【Swift】 それ、enumとstructでやってみましょう!!

• Swiftおさらい

• Swift の struct

• structと class

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

• Swift の enum

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

本日のメニュー

Page 13: 【Swift】 それ、enumとstructでやってみましょう!!

structと class

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

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

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

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

Page 14: 【Swift】 それ、enumとstructでやってみましょう!!

• 大きな違い

structと class

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

Page 15: 【Swift】 それ、enumとstructでやってみましょう!!

• Swiftおさらい

• Swift の struct

• structと class

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

• Swift の enum

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

本日のメニュー

Page 16: 【Swift】 それ、enumとstructでやってみましょう!!

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

Page 17: 【Swift】 それ、enumとstructでやってみましょう!!

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

◆問題点

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

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

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

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

Page 18: 【Swift】 それ、enumとstructでやってみましょう!!

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

◆問題点

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

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

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

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

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

Page 19: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

Page 20: 【Swift】 それ、enumとstructでやってみましょう!!

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

でもちょっとだけ注意!

Page 21: 【Swift】 それ、enumとstructでやってみましょう!!

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

Controllerクラスファイル

struct A 実装

class実装

Controllerクラスファイル

class実装

データAクラスファイル

class実装

structファイル

struct B 実装

struct C 実装

データBクラスファイル

class実装

class(データ)実装

classが混在…

classがいっぱい…

◆Before ◆After

Page 22: 【Swift】 それ、enumとstructでやってみましょう!!

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

ViewControllerクラスファイル

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

モデルクラスファイル

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

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

Storyboard

View実装

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

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

Page 23: 【Swift】 それ、enumとstructでやってみましょう!!

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

ElephantViewController.swift

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

ElephantModel.swift

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

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

Elephant.xib

ぞうさんの絵

Page 24: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

Page 25: 【Swift】 それ、enumとstructでやってみましょう!!

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

Page 26: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

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

Page 27: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

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

どうしよう・・・

Page 28: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

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

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

Page 29: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

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

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

待った!!

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

Page 30: 【Swift】 それ、enumとstructでやってみましょう!!

• Swiftおさらい

• Swift の struct

• struct と class

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

• Swift の enum

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

本日のメニュー

Page 31: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の enum

Enumとは?

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

色型 {

赤 = 0

青 = 1

黄 = 2

}

Page 32: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の enum

Objective-C の enum

・初期化

定義する

変数に当て込み

Page 33: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の enum

Swift の enum・初期化

定義する

変数に当て込み

Page 34: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の enum

Swift の enum・初期化

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

変数に当て込み

Page 35: 【Swift】 それ、enumとstructでやってみましょう!!

Objective-C の enum

・処理

関数定義

hogeから呼び出し

Page 36: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の enum・処理

関数定義

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

Page 37: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の enum・処理

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

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

Page 38: 【Swift】 それ、enumとstructでやってみましょう!!

Swift の enum・処理

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

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

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

Page 39: 【Swift】 それ、enumとstructでやってみましょう!!

• Swiftおさらい

• Swift の struct

• struct と class

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

• Swift の enum

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

本日のメニュー

Page 40: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

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

Page 41: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

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

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

Page 42: 【Swift】 それ、enumとstructでやってみましょう!!

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

組み込む!

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

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

Page 43: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

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

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

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

Page 44: 【Swift】 それ、enumとstructでやってみましょう!!

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

表現するとこんな感じ。

シ、シ、シンプル!!!

Page 45: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

Page 46: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

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

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

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

Page 47: 【Swift】 それ、enumとstructでやってみましょう!!

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

Page 48: 【Swift】 それ、enumとstructでやってみましょう!!

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

表現するとこんな感じ。

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

Page 49: 【Swift】 それ、enumとstructでやってみましょう!!

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

Page 50: 【Swift】 それ、enumとstructでやってみましょう!!

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

ElephantViewController.swift

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

ElephantModel.swift

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

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

Elephant.xib

ぞうさんの絵

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

Page 51: 【Swift】 それ、enumとstructでやってみましょう!!

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

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

Page 52: 【Swift】 それ、enumとstructでやってみましょう!!

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

Page 53: 【Swift】 それ、enumとstructでやってみましょう!!

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

やってみましょう!!

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

http://qiita.com/uin010bm

uin010bm

Qiita