制御構文2
MOBILEPROGRAMMING OCT, 15TH
テキスト
制御構文!
▸ ifやfor-inなど分岐や繰り返し処理を特定の文に構造化したもの
▸ プログラムの構造は 順次、選択、反復の三つに分類される
▸ これらを組み合わせてプログラミングする方法を構造化プログラ
ミングと呼ぶ
▸ 今回は繰り返しの構文に絞ってやって行きます
▸ 言語によってはforやwhileという構文が存在しない(or ただのシ
ンタックスシュガー)
1. FOR-IN
テキスト
FOR-IN文
▸ 繰り返し処理をするときの基本的な構文
▸ 構文は for <変数> in <Array or Range> { /* loop */ }
▸ 下記のforと区別するために for-inと呼ばれます
▸ for (int i = 0; i <= 10, i++) { /* loop */ }
▸ のような構文はSwift 3.0 以降廃止されました
▸ このようなfor文をC-style forと呼びます
▸ for文は特定の回数繰り返し処理をしたいというような場合によく使います
テキスト
なんでC-STYLE FOR は消えた?
▸ 簡潔にいうとSwiftらしくないから
▸ C言語経験者以外にはわかりにくいし
▸ 初めてSwiftを学ぶ人にとっては覚えにくい
▸ インクリメント、デクリメントによる問題もあるし
for (let i = 0; i <= 10; i++) {
// loop...
for (let j = 0; j <= 10;, i++) {
print("it's a infinity loop!")
}
}
ではどうやって
ループさせる?🤔
1-1.RANGE
テキスト
RANGE(範囲演算子)を使う
▸ 一番簡単なやり方
▸ switchの時に出てきたように 0…10 として 0 ~ 10までの
Sequence(Array)を作成
▸ それをfor-inと組み合わせる
// Range
let range = 0...10
for number in range {
print("number: (number)")
}
テキスト
FOR-IN STLIDE
▸ for-inと stlide を使用することで間隔を開けてループさせる
ことができます
// 0から10まで二つとびでループ
for number in stride(from: 0, to: 10, by: 2) {
print("number: (number)")
}
1-2. ARRAY
テキスト
ARRAYを使う
▸ これも非常にオーソドックスなやり方
▸ 定義済みのarrayに対してfor-inを使う
▸ indexでアクセスする方法に比べ Array の範囲外にアクセス
してしまうことがないため安全
// Array
let array = ["sunday", "monday", "tuesday", "wednsday", "thursday",
"friday", "Saturday"]
for number in array {
print("number: (number)")
}
1-3.DICTIONARY
テキスト
DICTIONARYを使う
▸ これも割とオーソドックスなやり方
▸ 定義済みのdictionaryに対してfor-inを使う
▸ key, value の形になっているため for の引数は二つになる
// Dictionary
let dic = ["Animal": "Cat", "Fruit": "Banana"]
for (key, value) in dic {
print("key: (key)")
print("value: (value)")
}
2. WHILE
テキスト
WHILE文
▸ 繰り返し処理をするときの基本的な構文
▸ 構文は while <ループ条件> { /* loop */ }
▸ while文は特定の条件にマッチするまで繰り返し処理をした
い時に使う
var count = 0
var total = 0
while count < 5 {
count += 1
total += count
}
print("count: (count) total: (total)")
3. 制御転送
テキスト
制御転送(CONTROL TRANSFER STATEMENTS)?🤔
▸ 制御転送(Control Transfer Statements)はプログラムの処理
ををある場所から別の場所に移す機能のこと
▸ 例えばcontinue や break, switchのfallthroughなどがある
▸ 関数のreturnや エラー処理に出てくる throw も同じ
▸ 今回はbreakとcontinueに絞ってお話をします
3-1.BREAK
テキスト
BREAK
▸ 他の言語同様Swiftにも break があります
▸ 特定の条件の時にループから抜けたい場合にbreakを使用し
ます
for i in 0...10 { // 11回ループさせます。
if i >= 3 { // i が 3 以上になったときに抜ける
break
}
print(i)
}
3-2. CONTINUE
テキスト
CONTINUE
▸ 他の言語同様Swiftにも continue があります
▸ 特定の条件の時に処理をスキップしたい場合はcontinueを使
用します
▸ breakとは違いloopを抜けることはありません
for i in 0...10 {
if i % 3 == 0 { // 3の倍数の時はスキップ
continue
}
print(i)
}
おまけ
テキスト
FORやWHILEを使わない?🤔
▸ 冒頭で少しお話した通り言語によってはforやwhileが存在し
ないです
▸ ではどうやって繰り返しを表現するのでしょうか?
▸ 方法はいくつかあり一つは高階関数を使う方法
▸ もう一つは再帰関数を使う方法です
おまけ: 高階関
数
テキスト
高階関数?🤔
▸ 関数を引数にとったり、関数を返す関数
▸ ややこしいので今は詳しくは説明しません
▸ 繰り返しのための有名どころでは map, や forEach などがあ
ります
▸ for-inを使う方法より簡潔に書くことができます
テキスト
たとえば?🤔
▸ 値段のリストに対して消費税をかけた後の値段のリストを生
成する例を考えます
▸ これをfor-inで書くと次のようになります
テキスト
ランダムに生成した数値の倍数を求める
// 消費税率

let taxRate = 0.08
// 値段のリスト
let prices: [Double] = [10000, 9800, 34570, 29800, 114514]
// まずは空の配列を生成
var newPrices = [Double]()
テキスト
ランダムに生成した数値の倍数を求める
// 消費税率

let taxRate = 0.08
// 値段のリスト
let prices: [Double] = [10000, 9800, 34570, 29800, 114514]
// まずは空の配列を生成
var newPrices = [Double]()

// for-inで一度配列から取り出して・・・
for price in prices {
}
テキスト
ランダムに生成した数値の倍数を求める
// 消費税率

let taxRate = 0.08
// 値段のリスト
let prices: [Double] = [10000, 9800, 34570, 29800, 114514]
// まずは空の配列を生成
var newPrices = [Double]()

// for-inで一度配列から取り出して・・・
for price in prices {
let newPrice = price * taxRate
newPrices.append(newPrice) // また配列へ入れる!
}
控えめに言って
面倒😩
テキスト
高階関数を使った場合
▸ 高階関数(今回はmap)を使うと次のように書くことができま
す
// 消費税率

let taxRate = 0.08
// 値段のリスト
let prices: [Double] = [10000, 9800, 34570, 29800, 114514]
テキスト
高階関数を使った場合
▸ 高階関数(今回はmap)を使うと次のように書くことができま
す
// 消費税率

let taxRate = 0.08
// 値段のリスト
let prices: [Double] = [10000, 9800, 34570, 29800, 114514]
let newPrices = prices.map { $0 * taxRate } // 完成!
短い!😳
テキスト
短い!😳
▸ 高階関数を使うととても簡潔にかけます
▸ 今回使ったmapという高階関数は配列の中身に順番に受け
取った処理を適用し、新しい配列を生成する関数です
▸ { $0 * taxRate } の部分が配列の中身全てに適用され、その結
果が新しい配列となります
▸ 高階関数を使うことで余計なコードを省き、どんな処理を
したいのか?という部分に集中できます
ちょっと待って!
(TWITTER並感)
そもそも関数って
なんだっけ?🤔

Mobile programming control_flow2