【swift】 それ、enumとstructでやってみましょう!!
TRANSCRIPT
自己紹介
株式会社サイバーエージェントにて、プーペガール・スマートフォン版ピグの開発に従事。
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
Swift の struct・処理
関数を含める事ができるので、判定や値の変換などデータに関わる処理をまとめる事ができる&使い回せる
関数定義
インスタンスに対して呼び出し
• Swiftおさらい
• Swift の struct
• structと class
• それ、structでやってみましょう!
• Swift の enum
• それ、enumでやってみましょう!
本日のメニュー
structと class
• classプロパティやメソッド(関数)をまとめて定義するもの。
• struct複数の変数をまとめて定義し、カプセル化するもの。
主にデータをまとめて保持する為のもの。
Swiftだと class も structもあまり見た目かわりませんが、、なにが違うのでしょう??
• Swiftおさらい
• Swift の struct
• structと class
• それ、structでやってみましょう!
• Swift の enum
• それ、enumでやってみましょう!
本日のメニュー
structは色々面倒だと思ってたのでclass使ってました。。。
◆問題点
・そもそもデータはデータとして扱うべき!!
・また余計なクラスファイルが、、、
・コピーにいちいち新しくインスタンス作って必要なプロパティを代入せねば、、、
・今後言語仕様が変わったらどうしよう、、、ex) せっかく structで便利な機能出たのにうちは class 使ってるからダメだ、、
structは色々面倒だと思ってたのでclass使ってました。。。
◆問題点
・そもそもデータはデータとして扱うべき!!
・また余計なクラスファイルが、、、
・コピーにいちいち新しくインスタンス作って必要なプロパティを代入せねば、、、
・今後言語仕様が変わったらどうしよう、、、ex) せっかく structで便利な機能出たのにうちは class 使ってるからダメだ、、
それ、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とはつまりデータを格納するための型定義なので、
継承させるという考え方自体が少しおかしいかも。。
やっぱりクラスかな・・・
待った!!
それ、enumでやってみましょう!
• Swiftおさらい
• Swift の struct
• struct と class
• それ、structでやってみましょう!
• Swift の enum
• それ、enumでやってみましょう!
本日のメニュー
Swift の enum・処理
クラスメソッドの様にenumのメソッドを実行
インスタンスに対して実行すると自分自身が変わる
関数を含める事ができるので、enumの値に応じた関数を盛り込むことができる
• Swiftおさらい
• Swift の struct
• struct と class
• それ、structでやってみましょう!
• Swift の enum
• それ、enumでやってみましょう!
本日のメニュー
まずは ColorプロパティをElephant structに
組み込む!
考え方をデータ主体に変えてみると・・・
『黄色いぞうさん』 をクラスを使わずに表現するには、『ぞうさん』というデータに『色』というデータを持たせれば良い!
次に enumを定義し、『黄色いぞうさん』の時に高さが
2倍になるように表現してみる!
enumはクラスで処置が含まれる変数を定義するのと同じ様に
処理が含まれる変数を定義できる!
これを利用して色別にセットされる高さの比率を設定できた!
ElephantColor enumに渡された食事数に対して何キロ太るか
計算する関数を追加する!
enum内の関数は各値のswitch分を含むのがスタンダードとなる。
また Swift は enumに対する switch 文に抜けているケースがあると
エラーを出してくれるので安心!(そして default がいらない!)
ちなみに enumを組み込むとしたらこんな感じ?(ぞうさんver)
ElephantViewController.swift
class実装・画面にリスト分のぞうさんを描画
ElephantModel.swift
class実装・プロパティとしてぞうさんのリストを保持・ぞうさんを生成してリストに追加する関数・ぞうさんをコピーしてリストに追加する関数・リストにいるぞうさんの体重を増やす関数
struct実装・ぞうさんの体重と高さを保持・ぞうさんの体重を増やす関数
Elephant.xib
ぞうさんの絵
enum実装・ぞうさんの色毎の処理
どうだったでしょう!?思った以上に structと enumで表現できてしまったと思いませんか!?
特に enumはこの他にも値に情報を持たせたり、Tupleを使って複雑にしたり、、色々できてしまいます!!!