패턴 매칭 (Pattern Matching) - ehrldyd15/Swift_Skills GitHub Wiki
패턴 매칭(Pattern Matching) 개념 (Optional 패턴, Expression 패턴, switch 문과 ~= 연산자)
많이 사용하는 패턴
1. 바인딩
let age = (20, 34)
switch age {
case let (a1, a2):
print("\(a1), \(a2)")
default:
break
}
2. 와일드 카드
switch age {
case let (a1, _): // '_' 와일드 카드 패턴
print("\(a1), \(a2)")
default:
break
}
3. 튜플
let (v1, v2) = (1, 2)
print(v1)
print(v2)
4. enum
enum MyEnum {
case a(Int)
case b
}
let myEnum = MyEnum.a(10)
if case let a(int) = myEnum {
print(int)
}
익숙하지 않은 패턴
1. 옵셔널 패턴
some 키워드를 이용하여 패턴을 매칭하고, 이 키워드를 사용하면 unwrapping도 자동으로 수행
let v1: Int? = 100
if case .some(let int) = v1 {
print(int)
}
보통 switch문에서 unwrapping 할때 사용
let v1: Int? = 100
switch v1 {
case let .some(int):
print(int)
default:
print("not")
}
2. 표현패턴(Expression Pattern)
~= 연산자의 결과가 true를 반환하여 매칭시키는 패턴
Swift에서 디폴트로 구현되어있는 형태는 범위를 체크할 수 있는 형태로 구현되어 있음
let v = 7
if 0...10 ~= v {
print("0 ~ 10")
} else {
print("not contains")
}
Switch 구문에서 내부적으로 사용되고 있는 패턴
switch 7 {
case 0...10:
print("0 ~ 10")
default:
print("not contains")
}
~=를 오버라이딩하면 다르게 사용이 가능
인수 중 첫 번째 인수는 switch문의 case에 해당하는 값이오고, 두 번째 인수는 switch문의 condition에 해당하는 값
func ~= (caseValue: String, conditionValue: Int) -> Bool {
return caseValue == "\(conditionValue)"
}
let myValue = 10
switch myValue {
case "1":
print("1")
case "10":
print("10")
default:
print("default")
}
// "10"
만약 내부 class에서 해당 switch문에만 ~=를 재정의하고 싶은 경우, static func ~= 로 정의하여 사용