수색…


매개 변수

매개 변수 세부
테스트 할 값 비교 대상 변수

비고

가능한 모든 입력 값에 대해 사례를 제공하십시오. 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 문에서 하나의 대소 문자가 여러 값과 일치 할 수 있습니다.

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 문에서 단일 case는 값 범위를 일치시킬 수 있습니다.

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 문 사용

switch 문 일치 내에서 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")
}

스위치를 사용하여 여러 제약 조건 중 하나 충족

터플을 생성하고 다음과 같은 스위치를 사용할 수 있습니다 :

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 사례는 생략합니다.

스위치 및 선택 항목

결과가 선택 사항 인 경우의 몇 가지 예입니다.

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