制御構文
条件分岐、繰り返し、遅延実行、パターンマッチ
プログラムの実行フローを制御する構文。制御フローの制御には条件分岐や繰り返しなどがあり、それを組み合わせ実行し自在に操る
if 文 条件の成否による分岐
chapter5.swift
let value = 5
if value <= 4 {
print("valueは4以下")
}else {
print("valueは5以上")
}
if let文 値の有無による分岐
オプショナル型とは変数にnilの代入を許容するデータ型で、反対に非オプショナル型はnilを代入できません。オプショナル型の変数にはデータ型の最後に「?」か「!」をつけます。
chapter5.swift
let optionalA = Optional(1)
if let a = optionalA {
print("値は\(a)です")
}else {
print("値は存在しません")
}
let optionalB = Optional("b")
let optionalC = Optional("c")
if let b = optionalB, let c = optionalC{
print("値は\(b)と\(c)ですよ")
}else {
print("ない")
}
guardl文 条件不成立時に早期退出する分岐
guard文は、条件を満たさない場合の処理を記述する構文です。
条件を満たさない場合には、メソッドを終了したり、繰り返し処理を終了したり、スコープを抜けるための処理を書く必要がある。
guard文を使って条件を満たさない場合に処理を抜けるコード
chapter5.swift
//guard 条件式 else {
// 条件式がfalseの場合実行される文
// guard文が記述されているスコープ文に退出する必要がある
//}
func someFunction() {
let value = -1
guard value >= 0 else {
print("0未満の値")
return
}
print(value)
}
someFunction()
guard文のスコープ外への退出の強制
chapter5.swift
func printIfPositive(_ a: Int) {
guard a > 0 else {
return
}
print(a)
}
printIfPositive(6)
guard文で宣言された変数や定数へのアクセス
guard let文とif letぶんの違いは
guard let文で宣言された変数や定数は guard let文以降で利用可能という点
chapter5.swift
func someFONCTION() {
let a :Any = 3
guard let int = a as? Int else {
print("aはInt型ではありません")
return
}
print("値はInt型の\(int)です")
}
someFONCTION()
func checkInt(num:Int) {
guard num >= 0 else {
print("マイナスです")
return
}
print("プラスです")
}
checkInt(num:-10)
checkInt(num:10)
switch文 複数のパターンマッチによる分岐
chapter5.swift
let r = -1
switch r {
case Int.min ..< 0:
print("rは負の数")
case 1 ..< Int.max:
print("rは正の数")
default:
print("aは0")
}
ケースの網羅性のチェック
chapter5.swift
enum SomeEnum {
case foo
case bar
case baz
}
let foo = SomeEnum.foo
switch foo {
case .foo:
print(".foo")
case .bar:
print(".bar")
case .baz:
print(".baz")
}
whereキーワード ケースにマッチする条件の追加
chapter5.swift
let optionalP: Int? = 12
switch optionalP {
case .some(let a) where a > 10:
print("10より大きい値\(a)が存在します")
default:
print("値が存在しない、もしくは、10以下")
}
let g = 1
switch g {
case 1:
print("実行される")
break
print("実行されない")
default:
break
}