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 문에서 하나의 대소 문자가 여러 값과 일치 할 수 있습니다.
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")
}
- 값이 (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
사례는 생략합니다.
스위치 및 선택 항목
결과가 선택 사항 인 경우의 몇 가지 예입니다.
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
}
}