サーチ…


パラメーター

パラメータ詳細
テストする値比較する変数

備考

入力可能なすべての値についてケースを提供します。 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")
}
  1. 値が(0,0,0)の場合に正確に一致します。これは3D空間の起源です。
  2. y = 0、z = 0、xの任意の値に一致します。これは、座標がx軸上にあることを意味します。
  3. x = 0、z = 0、yの任意の値に一致します。これは座標が軸上にあることを意味します。
  4. x = 0、y = 0および任意のzの値に一致します。これは、座標がz軸上にあることを意味します。
  5. 残りの座標と一致します。

注:アンダースコアを使用することは、値を気にしないことを意味します。

値を無視したくない場合は、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使用します。

3.0
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.0

スウィフト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
  }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow