Swift Language
スイッチ
サーチ…
パラメーター
パラメータ | 詳細 |
---|---|
テストする値 | 比較する変数 |
備考
入力可能なすべての値についてケースを提供します。 default case
を使用して、指定しない残りの入力値をカバーします。デフォルトのケースは最後のケースでなければなりません。
デフォルトでは、Swiftのスイッチは、大文字と小文字がマッチした後、他のケースを引き続きチェックしません。
基本的な使用
let number = 3
switch number {
case 1:
print("One!")
case 2:
print("Two!")
case 3:
print("Three!")
default:
print("Not One, Two or Three")
}
switch文は、整数以外のデータ型でも動作します。彼らは任意のデータ型で動作します。これは、文字列を切り替える例です:
let string = "Dog"
switch string {
case "Cat", "Dog":
print("Animal is a house pet.")
default:
print("Animal is not a house pet.")
}
これは以下を印刷します:
Animal is a house pet.
複数の値のマッチング
switch文の1つの大文字と小文字は、複数の値にマッチします。
let number = 3
switch number {
case 1, 2:
print("One or Two!")
case 3:
print("Three!")
case 4, 5, 6:
print("Four, Five or Six!")
default:
print("Not One, Two, Three, Four, Five or Six")
}
範囲のマッチング
switch文の1つの大文字と小文字は、ある範囲の値に一致します。
let number = 20
switch number {
case 0:
print("Zero")
case 1..<10:
print("Between One and Ten")
case 10..<20:
print("Between Ten and Twenty")
case 20..<30:
print("Between Twenty and Thirty")
default:
print("Greater than Thirty or less than Zero")
}
スイッチでwhereステートメントを使用する
whereステートメントは、スイッチのマッチ内で使用して、正の一致に必要な追加の条件を追加することができます。次の例では、範囲だけでなく、数値が奇数か偶数かをチェックします。
switch (temperature) {
case 0...49 where temperature % 2 == 0:
print("Cold and even")
case 50...79 where temperature % 2 == 0:
print("Warm and even")
case 80...110 where temperature % 2 == 0:
print("Hot and even")
default:
print("Temperature out of range or odd")
}
スイッチを使用して複数の制約の1つを満たす
タプルを作成し、次のようなスイッチを使用することができます:
var str: String? = "hi"
var x: Int? = 5
switch (str, x) {
case (.Some,.Some):
print("Both have values")
case (.Some, nil):
print("String has a value")
case (nil, .Some):
print("Int has a value")
case (nil, nil):
print("Neither have values")
}
部分一致
switch文は部分一致を利用します。
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (0, 0, 0): // 1
print("Origin")
case (_, 0, 0): // 2
print("On the x-axis.")
case (0, _, 0): // 3
print("On the y-axis.")
case (0, 0, _): // 4
print("On the z-axis.")
default: // 5
print("Somewhere in space")
}
- 値が(0,0,0)の場合に正確に一致します。これは3D空間の起源です。
- y = 0、z = 0、xの任意の値に一致します。これは、座標がx軸上にあることを意味します。
- x = 0、z = 0、yの任意の値に一致します。これは座標が軸上にあることを意味します。
- x = 0、y = 0および任意のzの値に一致します。これは、座標がz軸上にあることを意味します。
- 残りの座標と一致します。
注:アンダースコアを使用することは、値を気にしないことを意味します。
値を無視したくない場合は、switch文で次のように使用できます。
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (0, 0, 0):
print("Origin")
case (let x, 0, 0):
print("On the x-axis at x = \(x)")
case (0, let y, 0):
print("On the y-axis at y = \(y)")
case (0, 0, let z):
print("On the z-axis at z = \(z)")
case (let x, let y, let z):
print("Somewhere in space at x = \(x), y = \(y), z = \(z)")
}
ここで、軸のケースでは、let構文を使用して関連する値を引き出します。コードは文字列補間を使用して値を出力し、文字列を作成します。
注意:このswitch文では、デフォルトは必要ありません。なぜなら、タプルのどの部分にも制約がないからです。 switch文がすべての可能な値をそのケースで使い果たした場合、デフォルトは必要ありません。
let-where構文を使用して、より複雑なケースに合わせることもできます。例えば:
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (let x, let y, _) where y == x:
print("Along the y = x line.")
case (let x, let y, _) where y == x * x:
print("Along the y = x^2 line.")
default:
break
}
ここでは、「yはxと等しい」と「yはxが等しい」と一致します。
スイッチフォールスルー
人々がよく知っている他の言語とは異なり、迅速に、それぞれのケース・ステートメントの終わりに暗黙の休憩があることは注目に値する。次のケースに進むためには(つまり、複数のケースが実行される)、 fallthrough
ステートメントを使用する必要があります。
switch(value) {
case 'one':
// do operation one
fallthrough
case 'two':
// do this either independant, or in conjunction with first case
default:
// default operation
}
これはストリームのようなものに便利です。
スイッチと列挙型
Switchステートメントは、Enum値と非常によく動作します
enum CarModel {
case Standard, Fast, VeryFast
}
let car = CarModel.Standard
switch car {
case .Standard: print("Standard")
case .Fast: print("Fast")
case .VeryFast: print("VeryFast")
}
車の可能な値ごとにケースを提供したので、
default
ケースは省略しdefault
。
スイッチとオプション
結果がオプションのいくつかの例の場合。
var result: AnyObject? = someMethod()
switch result {
case nil:
print("result is nothing")
case is String:
print("result is a String")
case _ as Double:
print("result is not nil, any value that is a Double")
case let myInt as Int where myInt > 0:
print("\(myInt) value is not nil but an int and greater than 0")
case let a?:
print("\(a) - value is unwrapped")
}
スイッチとタプル
スイッチはタプルをオンにすることができます:
public typealias mdyTuple = (month: Int, day: Int, year: Int)
let fredsBirthday = (month: 4, day: 3, year: 1973)
switch theMDY
{
//You can match on a literal tuple:
case (fredsBirthday):
message = "\(date) \(prefix) the day Fred was born"
//You can match on some of the terms, and ignore others:
case (3, 15, _):
message = "Beware the Ides of March"
//You can match on parts of a literal tuple, and copy other elements
//into a constant that you use in the body of the case:
case (bobsBirthday.month, bobsBirthday.day, let year) where year > bobsBirthday.year:
message = "\(date) \(prefix) Bob's \(possessiveNumber(year - bobsBirthday.year))" +
"birthday"
//You can copy one or more elements of the tuple into a constant and then
//add a where clause that further qualifies the case:
case (susansBirthday.month, susansBirthday.day, let year)
where year > susansBirthday.year:
message = "\(date) \(prefix) Susan's " +
"\(possessiveNumber(year - susansBirthday.year)) birthday"
//You can match some elements to ranges:.
case (5, 1...15, let year):
message = "\(date) \(prefix) in the first half of May, \(year)"
}
クラスに基づいたマッチング - prepareForSegueのための素晴らしい
また、切り替え中のもののクラスに基づいてswitch文を切り替えることもできます。
これが便利な例はprepareForSegue
。私はsegue識別子に基づいて切り替えるのが常であったが、それは壊れやすい。後でストーリーボードを変更してセグメント識別子の名前を変更すると、コードが破損します。または、同じビューコントローラクラス(ただし異なるストーリーボードシーン)の複数のインスタンスにセグを使用する場合は、セグメント識別子を使用してターゲットのクラスを把握することはできません。
スィッチスイッチのステートメントをレスキューする。
Swiftのcase let var as Class
、次のようにcase let var as Class
構文case let var as Class
使用します。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.destinationViewController {
case let fooViewController as FooViewController:
fooViewController.delegate = self
case let barViewController as BarViewController:
barViewController.data = data
default:
break
}
}
スウィフト3では、sytaxはわずかに変化しました:
override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.destinationViewController {
case let fooViewController as FooViewController:
fooViewController.delegate = self
case let barViewController as BarViewController:
barViewController.data = data
default:
break
}
}