SlideShare ist ein Scribd-Unternehmen logo
1 von 53
それ、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

Weitere ähnliche Inhalte

Was ist angesagt?

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 

Was ist angesagt? (20)

.NET 7期待の新機能
.NET 7期待の新機能.NET 7期待の新機能
.NET 7期待の新機能
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
MVVM入門
MVVM入門MVVM入門
MVVM入門
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだ
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
Deflate
DeflateDeflate
Deflate
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
なぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのかなぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのか
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 

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

Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
masakazusegawa
 
Mochrom - スマートフォンビジネスサミット
Mochrom - スマートフォンビジネスサミットMochrom - スマートフォンビジネスサミット
Mochrom - スマートフォンビジネスサミット
Katsuaki Sato
 

Ähnlich wie 【Swift】 それ、enumとstructでやってみましょう!! (20)

Swiftビギナーズ勉強会 第1回 @Co-Edo
Swiftビギナーズ勉強会 第1回 @Co-EdoSwiftビギナーズ勉強会 第1回 @Co-Edo
Swiftビギナーズ勉強会 第1回 @Co-Edo
 
Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応Swift事情2014夏 ~ Swift入門 beta6対応
Swift事情2014夏 ~ Swift入門 beta6対応
 
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回    @Co-EdoiOSアプリ開発のためのSwiftビギナーズ勉強会 第6回    @Co-Edo
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
 
Spring.project
Spring.projectSpring.project
Spring.project
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
我が家のフロントエンド開発事情
我が家のフロントエンド開発事情我が家のフロントエンド開発事情
我が家のフロントエンド開発事情
 
Svgアニメーションを実装してみよう 20150207
Svgアニメーションを実装してみよう 20150207Svgアニメーションを実装してみよう 20150207
Svgアニメーションを実装してみよう 20150207
 
Bootstrapにちょい足しアニメーション@春のJavascript祭り
Bootstrapにちょい足しアニメーション@春のJavascript祭りBootstrapにちょい足しアニメーション@春のJavascript祭り
Bootstrapにちょい足しアニメーション@春のJavascript祭り
 
プロトタイピングでしあわせになろうよ
プロトタイピングでしあわせになろうよプロトタイピングでしあわせになろうよ
プロトタイピングでしあわせになろうよ
 
通常の3倍の速度で プログラミング!? 「 Emacsキーバインドのすすめ」
通常の3倍の速度でプログラミング!?「 Emacsキーバインドのすすめ」通常の3倍の速度でプログラミング!?「 Emacsキーバインドのすすめ」
通常の3倍の速度で プログラミング!? 「 Emacsキーバインドのすすめ」
 
UXを損ねる静的コンテンツ配信アンチパターン7選
UXを損ねる静的コンテンツ配信アンチパターン7選UXを損ねる静的コンテンツ配信アンチパターン7選
UXを損ねる静的コンテンツ配信アンチパターン7選
 
2022_08_10 SaaS.tech #5業務システム開発でデザインとフロントエンドも妥協しない話
2022_08_10 SaaS.tech #5業務システム開発でデザインとフロントエンドも妥協しない話2022_08_10 SaaS.tech #5業務システム開発でデザインとフロントエンドも妥協しない話
2022_08_10 SaaS.tech #5業務システム開発でデザインとフロントエンドも妥協しない話
 
スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向スマートフォンアプリケーション開発の最新動向
スマートフォンアプリケーション開発の最新動向
 
PhoneGapユーザー会@大阪 講演資料
PhoneGapユーザー会@大阪 講演資料PhoneGapユーザー会@大阪 講演資料
PhoneGapユーザー会@大阪 講演資料
 
Swiftビギナーズ倶楽部 vol.2
Swiftビギナーズ倶楽部 vol.2Swiftビギナーズ倶楽部 vol.2
Swiftビギナーズ倶楽部 vol.2
 
あなたも出来る!webエンジニアがSwiftでリリースするためにやったこと
あなたも出来る!webエンジニアがSwiftでリリースするためにやったことあなたも出来る!webエンジニアがSwiftでリリースするためにやったこと
あなたも出来る!webエンジニアがSwiftでリリースするためにやったこと
 
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
 
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
 
プロ文.com 勉強会 Phase 1
プロ文.com 勉強会 Phase 1プロ文.com 勉強会 Phase 1
プロ文.com 勉強会 Phase 1
 
Mochrom - スマートフォンビジネスサミット
Mochrom - スマートフォンビジネスサミットMochrom - スマートフォンビジネスサミット
Mochrom - スマートフォンビジネスサミット
 

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