SlideShare a Scribd company logo
制御構文1
MOBILEPROGRAMMING OCT, 10TH
テキスト
制御構文!
▸ ifやforなど分岐や繰り返し処理を特定の文に構造化したもの
▸ プログラムの構造は 順次、選択、反復の三つに分類される
▸ これらを組み合わせてプログラミングする方法を構造化プロ
グラミングと呼ぶ
▸ Swiftでは “if文” ですが 言語によっては “if式” と呼ぶこともあ
ります
▸ 今回は条件分岐の構文に絞ってやって行きます
テキスト
文?式?🤔(おまけ)
▸ 式と文の違いは 値を返すか否かです
▸ 例えば “if文” は値を返さないので右の例のようなことはでき
ません
let message = if age > 18 {
"成人です"
} else {
"未成年です"
}
let message: String
if age > 18 {
message = "成人です"
} else {
message = "未成年です"
}
文の場合 式の場合
1. IF
テキスト
IF文
▸ 条件によって処理を分岐させたいときにはifを使います
▸ 文法は
▸ if <条件式> { /* 条件が正の時 */ } else { /* 条件が負の時 */ }
▸ となります
▸ 条件が複数ある場合は else if も使えます
テキスト
例文
// 基本形
let age = 20
if age >= 20 {
print("成人してます!")
}
else {
print("未成年です")
}
// 条件が複数ある場合
if age >= 18 {
print("大学生です")
}
else if age >= 15 {
print("高校生です")
}
else if age >= 12 {
print("実は魔族だった私は中学生……少なく
}
else {
print("小学生です")
}
// elseは省略可能
if age >= 20 {
print("成人してます!")
}
SWIFTのIFは条件分
岐だけじゃない!
1-2. IF-LET
テキスト
IF-LET?🤔
▸ Optional型(Ex: Int?)から値を安全に取り出す方法
▸ Optional-binding(オプショナルバインディング)の一つ
▸ if-let 式と呼ばれる
▸ 条件分岐としてだけでなくこちらも非常によく使われる
▸ 文法は
▸ if let <変数名> = <optional> { /* not nil */ } else { /* nil */ }
テキスト
例文
// 基本形
let age: Int? = 20
if let a = age {
print("僕は (a)歳です!")
}
else {
print("年齢はありません")
}
// if-let + 条件分岐
let age: Int? = 20
if let a = age, a >= 20 {
print("僕は (a)歳で、成人してます!")
}
2. GUARD
テキスト
GUARD文
▸ Swift独自の構文
▸ 文法は guard <条件式> else { /* returnさせる */ }
▸ ifと違い条件にマッチした場合処理を進め、マッチしない場合は else のブロックの
中に入りそれ以上処理を進ませないようにします
▸ else ブロックの中には 必ず return を記述する必要があります。
▸ 条件にマッチしなかった場合にreturnさせるように処理を書くことをGuard節と言い
ます
▸ Swiftには guard という guard節専用の構文がありますが他の言語では if を使って実
現します
テキスト
例文
func forAdult(age: Int) {
guard age >= 18 else {
print("見せられないよ!")
return // これを書かないとエラー
}
print("Welcome to Underground...")
}
func forAdult(age: Int) {
if age < 18 {
print("見せられないよ!")
return
}
print("Welcome to Underground...")
}
左の二つは同じ処理をしてる
2-2. GUARD-LET
テキスト
GUARD-LET
▸ if-letと同じく guard-let式もあります
▸ 基本的にはguardと同じです
▸ 違いは nil だったら先に進ませないということくらい
▸ 文法は
▸ guard let <変数名> = <Optional> else { /* return */ }
テキスト
例文
func parseResponse(responseData: [String: Any]?) -> String? {
// check response
guard let data = responseData else {
print("response data is empty")
return nil
}
guard let id = data["id"] as? String else {
print("user id is not found.")
return nil
}
return id
}
ネットワーク経由で取得したデータをパースする
3. SWITCH
テキスト
SWITCH文
▸ ifと同じく条件分岐, optional-bindingをするときに使う
▸ 古い言語だと IntやFloatなどしか使えないがSwiftでは基本的
に何でもマッチングさせられる
▸ breakを書かなくても処理が次に移らない(fall-throughしない)
▸ 条件に合致させることをパターンマッチと呼んだりする
▸ めちゃくちゃ便利
テキスト
SWITCH文
▸ 文法は
switch <値> {
case <条件式1>:
/* 処理1 */
case <条件式2>:
/* 処理2 */
case <条件式3>:
/* 処理3 */
default:
/* それ以外 */
}
3-1. マッチング
について
3-1-1. 値マッチ
ング
テキスト
値マッチング
▸ シンプルに特定の値を指定してマッチングさせる方法
▸ Intの場合は値が 10だったら, 20だったらという形
▸ カンマで区切って複数の値を並べることもできる
let age = 20
switch age {
case 20:
print("成人です")
case 13, 14, 15:
print("中学生です")
case 12:
print("小学生です!")
default:
print("バブー!")
}
3-1-2. 範囲マッ
チング
テキスト
範囲マッチング
▸ 演算子のときに利用した 範囲演算子を利用してマッチングさせることも可能
▸ Intの場合は値が 10~20だったらという形
let age = 20
switch age {
case 16...18:
print("成人です")
case 13..<16:
print("中学生です")
case 6..<13:
print("小学生です!")
default:
print("バブー!")
}
3-1-3. タプル
マッチング
テキスト
タプル(TUPLE)?🤔
▸ Swiftで使われるデータ構造の一つ
▸ カンマで区切られたリスト
▸ Arrayとは違い複数の型を持つことができる
▸ 要素を持てる上限が決まっているため、Arrayのようには使わない
▸ ↓以下のような感じ
▸ let tuple = (10, “yuichiro”, 34.5, [“gas”, “gas”, “gas”])
▸ 先頭の要素から tuple.0, tuple.1 という形でアクセスする
▸ 要素に名前(ラベル)をつけることも可能(名前付きタプル)
▸ let tuple = (number: 10, string: “yuichiro”, float: 34.5, array: [“gas”, “gas”, “gas”])
テキスト
タプルマッチング
▸ 先ほど説明したTupleを利用してマッチングさせることも可能
▸ tupleの要素の数や値でマッチングさせる
switch user {
case let (age, name):
print("user is age: (age), name: (name)")
case (let age, "hogefuga"):
print("user is age: (age), name: hogefuga")
case (20, let name):
print("user is age: 20, name: (name)")
case (20, "hogefuga"):
print("user is age: 20, name: hogefuga")
case let (age, name, gender):
print(“マッチしません")
default:
print("something else")
}
3-1-4. ENUM
マッチング
テキスト
ENUM?🤔
▸ Swiftで使われるデータ構造の一つ
▸ 複数の値をグルーピングしておくことができる型
▸ 日本語では列挙型という
▸ 文法は enum <列挙名> { case <列挙子1>, case <列挙子2>, … }
▸ Swiftの列挙型も他の言語に比べると便利
▸ Optional型も実はクラスじゃなくてenumです
▸ 詳しくは後ほど勉強します
テキスト
ENUMマッチング
▸ 先ほど説明したenumを利用してマッチングさせることも可能
▸ enumの要素を指定してマッチングさせる
▸ 要素を指定する際には .(ドット)から始める
▸ エラー処理をenumで書くことが多い
▸ SwiftのEnumも非常に便利
▸ 長くなるので次に続きます
ENUMマッチング
enum NetworkError {
case authError
case unexpectedData
case unknownError
case nilResponse
}
switch error {
case .authError:
print("認証に失敗しました")
case .unexpectedData:
print("不正なデータです")
case .unknownError:
print("よくわかりませんがエラーです(^q^)")
case .nilResponse:
print("レスポンスが空っぽです")
case .timeout:
print("サーバーから応答がありません")
}
Mobile programming seigyokoubun
もう一度
enum NetworkError {
case authError
case unexpectedData
case unknownError
case nilResponse
}
switch error {
case .authError:
print("認証に失敗しました")
case .unexpectedData:
print("不正なデータです")
case .unknownError:
print("よくわかりませんがエラーです(^q^)")
case .nilResponse:
print("レスポンスが空っぽです")
case .timeout:
print("サーバーから応答がありません")
}
もう一度
enum NetworkError {
case authError
case unexpectedData
case unknownError
case nilResponse
}
switch error {
case .authError:
print("認証に失敗しました")
case .unexpectedData:
print("不正なデータです")
case .unknownError:
print("よくわかりませんがエラーです(^q^)")
case .nilResponse:
print("レスポンスが空っぽです")
case .timeout:
print("サーバーから応答がありません")
}
defaultがない!
DEFAULTがない!😨(二度目)
テキスト
DEFAULTが(RY😨
▸ enumマッチングの場合はdefaultは書かなくても良い(場合
がある)
▸ enumの要素全てを指定している場合は省略可能
▸ enumの場合必ず指定された値しかこないことが保証される
のでdefaultはいらない
3-1-5. OPTIONAL
マッチング
テキスト
OPTIONALマッチング
▸ Optional型(?型)を使用してマッチングさせる
▸ 形はenumに似ている
▸ 要素は some(value) か none のみ
▸ 値があったとき、無かったときで明確に処理を分けたい場合はif-letよりもこちらを推奨
let brain: Brain? = nil
switch brain {
case .some(let brain):
print("正常です")
case .none:
print("頭空っぽ!🤯")
}
3-1-5. TYPE-CAST
マッチング
テキスト
TYPE-CASTマッチング
▸ 型変換を使うもしくは特定の型を指定してマッチングさせるやり方
▸ 型変換を使う際は “as", 型を指定したい場合は “is” を使う
▸ できれば型変換を行うコードがないのが理想ではあるので使うことは
少ない(かも?)
let nyantyu: Animal = Cat(name: "nantyu")
switch nyantyu {
case let a as Cat:
print("猫でした(?)")
a.burk()
case is Dog:
print("犬です")
default:
print("動物ではありません")
}
3-2. SWITCHのオーバー
ロードについて
テキスト
SWITCHのオーバーロード?🤯
▸ case <条件式>:
▸ ↑の部分は挙動を書き換えることが可能!
▸ 対応する演算子は =~
▸ 自分で作ったクラスを好きなようにマッチングさせること
ができるようになる

More Related Content

PPTX
リーダブルコードが良書だったのでまとめました
PDF
リーダブルコード勉強会
PDF
Mobile programming control_flow2
PPTX
リーダブルコード 1.0'
KEY
リーダブルコード
PDF
後期第六回ネットワークチーム講座資料
PDF
Swift本ができるまで
PDF
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩
リーダブルコードが良書だったのでまとめました
リーダブルコード勉強会
Mobile programming control_flow2
リーダブルコード 1.0'
リーダブルコード
後期第六回ネットワークチーム講座資料
Swift本ができるまで
できるプログラマーを本気で育てるSwift超入門iosプログラマーへの第一歩

Similar to Mobile programming seigyokoubun (20)

PDF
Swift勉強会
PDF
Study Swift
PDF
Objective-CからSwiftへの移行講座
PPTX
iOSエンジニアのためのScala入門
PPTX
第2回iOSアプリ勉強会
PDF
勉強会資料ースイフト入門ー
PDF
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
PPTX
221217 SwiftはPythonに似ている
PDF
Swift 2.0 で変わったところ「前編」 #cswift
PDF
Swift らしい表現を目指そう #eventdots
PDF
Swift入門おさらい
PDF
2011年11月25日
PDF
20141128 iOSチーム勉強会 My Sweet Swift
PDF
Swift事情2014夏 ~ Swift入門 beta6対応
PDF
脱swift初心者するための2つのきっかけ
PDF
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
PPTX
SwiftのOptionalを理解する
PDF
Javascript3 1
PPTX
iPhoneアプリ開発の歩き方〜Swift編〜
PDF
Swift study vol.03
Swift勉強会
Study Swift
Objective-CからSwiftへの移行講座
iOSエンジニアのためのScala入門
第2回iOSアプリ勉強会
勉強会資料ースイフト入門ー
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
221217 SwiftはPythonに似ている
Swift 2.0 で変わったところ「前編」 #cswift
Swift らしい表現を目指そう #eventdots
Swift入門おさらい
2011年11月25日
20141128 iOSチーム勉強会 My Sweet Swift
Swift事情2014夏 ~ Swift入門 beta6対応
脱swift初心者するための2つのきっかけ
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
SwiftのOptionalを理解する
Javascript3 1
iPhoneアプリ開発の歩き方〜Swift編〜
Swift study vol.03
Ad

Mobile programming seigyokoubun