티스토리 뷰
[시작]
- 패턴에 익숙해지면 코드의 양을 줄이면서 문법을 더 잘 활용할 수 있게 된다.
- 패턴 : 단독 또는 복합 값의 구조를 나타내는 것
- 패턴 매칭 : 코드에서 어떤 패턴의 형태를 찾아내는 행위
- 대부분의 패턴은 switch, if, guard, for 등의 키워드와 함께, 두 개 이상의 키워드가 합을 이루어 동작한다.
- 크게 두 종류로 나눌 수 있다.
: 값을 해체(추출)하거나 무시하는 패턴 | 와일드카드 / 식별자 / 값 바인딩 / 튜플 패턴
: 패턴 매칭을 위한 패턴 | 열거형 케이스/ 옵셔널 / 표현 / 타입캐스팅 패턴
<값을 해체(추출)하거나 무시하는 패턴>
[와일드카드 패턴]
- 와일드카드 식별자(_, underscore)를 사용하여 '이 자리에 무엇이 오든지간에 상관하지 마라'는 뜻을 알림
: 와일드카드 식별자가 위치한 곳의 값을 무시함
- for-in / switch 구문 등에 사용할 수 있다.
let string = "ABC"
switch string {
case _:
print(string)
}
//ABC
let optionalString: String? = "CBA"
switch optionalString {
case "ABC"?:
print(string)
case _?:
print("ABC가 아닌 어떠한 문자열")
case nil:
print("nil")
}
//ABC가 아닌 어떠한 문자열
let myInfo = ("Presto", 24, "Male")
switch myInfo {
case ("Presto", _, _):
print("Presto")
case (_, _, _):
print("항상 실행됨")
}
//Presto
for _ in 1...2{
print("반복 실행")
}
//반복 실행
//반복 실행
[식별자 패턴]
- 변수 또는 상수의 이름에 알맞는 값을 어떠한 값과 매치시키는 패턴
let integer: Int = 3
integer 상수를 선언하는 동시에 해당 상수에 3이라는 값을 할당하려고 함.
상수의 타입인 Int와 할당하려는 값 3의 타입이 일치하면, integer는 3의 식별자가 되므로 식별자 패턴이 성립한다.
식별자 패턴이 성립하면 3이라는 값은 integer라는 상수에 할당된다.
- 경우에 따라 식별자 패턴은 값 바인딩 패턴의 일종이라고 할 수 있다.
[값 바인딩 패턴]
- 변수 또는 상수의 이름에 매치된 값을 바인딩하는 패턴
- 값 바인딩 패턴의 일종인 식별자 패턴은 매칭되는 값을 새로운 이름의 변수 또는 상수에 바인딩하는 것이다.
- 튜플의 요소를 해체하여 그에 대응하는 식별자 패턴에 각각의 요소 값을 바인딩할 수 있다.
let myInfo = ("Presto", 24, "Male")
switch myInfo {
case let (nickname, age, gender):
print(nickname, age, gender)
//Presto, 24, Male
}
switch myInfo {
case (let nickname, _, let gender):
print(nickname, gender)
//Presto, Male
}
let (a): Int = 2
let (b, c): (Int, Double) = (2, 3.4)
let name: String = "Presto"
let age: Int = 24
let gender: String? = "Male"
switch (name, age, gender) {
case ("ABC", _, _):
print("ABC")
case ("Presto", _, _):
print("Presto")
default:
print("default")
}
//Presto
let points: [(Int, Int)] = [(4, 2), (6, 1), (6, 2), (5, 1), (8, 5)]
for (x, _) in points {
print(x)
}
//4
//6
//6
//5
//8
let value: Int = 30
if case 0...100 = value {
print("0과 100 사이")
}
enum School {
case elementary(name: String)
case middle(name: String)
case high(name: String)
case graduate(name: String)
}
var schools = [School]()
schools.append(.elementary(name: "1"))
schools.append(.middle(name: "2"))
schools.append(.high(name: "3"))
schools.append(.graduate(name: "4"))
for school in schools {
switch school {
case .elementary(let name):
print(name)
default:
break
}
}
[옵셔널 패턴]
- 옵셔널 또는 암시적 추출 옵셔널 열거형에 감싸져 있는 값을 매치시킬 때 사용
- 식별자 패턴 뒤에 물음표를 넣어 표기, 열거형 케이스 패턴과 동일한 위치에 자리한다.
var optionalValue: Int? = 199
//열거형 케이스 패턴
if case .some(let value) = optionalValue {
print(value)
}
//옵셔널 패턴
if case let value? = optionalValue {
print(value)
}
func isItHasValue(_ optionalValue: Int?) {
guard case .some(let value) = optionalValue else {
print("none")
return
}
print(value)
}
isItHasValue(optionalValue)
while case .some(let value) = optionalValue {
print(value)
optionalValue = nil
}
print(optionalValue)
let array: [Int?] = [6, 2, nil, 1, nil]
for case let value? in array {
print(value)
}
[타입캐스팅 패턴]
- 타입캐스팅을 하거나 타입을 매치시킨다.
- is 패턴은 프로그램 실행 중에 값의 타입이 is 우측에 작성된 타입 또는 그 타입의 자식 클래스 타입이면 값과 매치시킨다.
: 반환된 결과값은 신경쓰지 않는다.
- as 패턴은 프로그램 실행 중에 값의 타입이 as 우측에 작성된 타입 또는 그 타입의 자식 클래스 타입이면 값과 매치시킨다.
: as 패턴이 원하는 타입으로 캐스팅된다.
- is 패턴은 switch의 case 레이블에서만 사용할 수 있다.
- is (TYPE_NAME)
- SomePattern as (TYPE_NAME)
let value: Any = 100
switch value {
case is String:
print("string")
case let value as Int:
print(value)
default:
print("string? int?")
}
'Swift > 야곰의 스위프트' 카테고리의 다른 글
27장 ARC (0) | 2018.05.01 |
---|---|
26장 where 절 (0) | 2018.04.30 |
24장 타입 중첩 (0) | 2018.04.28 |
23장 프로토콜 지향 프로그래밍 (0) | 2018.04.28 |
22장 제네릭 (0) | 2018.04.27 |