それ、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

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