안녕하세요. 도미닉입니다
오늘은 패턴에 대해서 알아보겠습니다.
패턴이란 소스의 양을 줄여서 쓰고 읽기 쉽게 정해놓은 구조 라고 생각할 수 있습니다.
패턴 매칭이란. 코드에서 패턴을 찾아내고 활용하는 것이라고 할 수 있겠습니다.
패턴에는 두가지 큰 유형이 있습니다.
모든 종류의 값에서 성공적으로 동작하는 패턴과 런타임 안에 지정된 값에 따라서 동작하지 못하는 패턴입니다.
첫 번째 종류의 패턴은 단순 변수, 상수 및 옵셔널 바인딩에서 값을 소멸시키는 데 사용됩니다. 여기에는 와일드 카드 패턴, 식별자 패턴 및 이를 포함하는 값 바인딩 패턴 또는 튜플 패턴이 포함됩니다. 이러한 패턴에서 타입 지정하여 특정 타입의 값만 일치하도록 제한 할 수 있습니다.
두 번째 종류의 패턴은 전체 패턴 일치에 사용되며, 여기서 일치시키려는 값은 런타임에 없을 수 있습니다. 여기에는 열거 케이스 패턴, 선택적 패턴, 표현식 패턴 및 타입 캐스팅 패턴이 포함됩니다. 이러한 패턴은 switch 문의 case 레이블, do 문의 catch 절 또는 if, while, guard 또는 for-in 문의 경우에서만 사용됩니다.
Wildcard Pattern(와일드카드 패턴)
Wildcard Pattern 은 밑줄 (_)로 모든 값을 무시하도록사용할 수 있습니다. 값을 쓰지 않으면 와일드 카드 패턴을 사용할 수 있습니다.
예를 들어, 다음 코드는 루프의 각 반복에서 범위의 현재 값을 무시하고 범위 1 ~ 3을 반복합니다.
만약 _ 를 x로 바꾼다면 x에 1,2,3이 들어가며 반복될 것이다. 값이 필요없다면 _ 를 사용한다.
Identifier Pattern (식별자 패턴)
Identifier Pattern 은 모든 값에서 사용 가능하며 값을 변수 또는 상수의 이름에 바인딩합니다.
예를 들어, 다음 상수 선언에서 someValue 는 Int 타입의 값 42와 매칭되는 식별자 패턴입니다.
Value-Binding Pattern (값 바인딩 패턴)
Value-Binding Pattern 은 값을 변수 또는 상수 이름에 바인딩합니다. 상수의 이름에 바인드하는 Value-Binding Pattern 은 let 키워드로 시작합니다. 변수 이름에 바인드하는 Value-Binding Pattern은 var 키워드로 시작합니다.
Value-Binding Pattern 내의 Identifier Pattern 은 새로운 이름의 변수 또는 상수를 일치하는 값에 바인딩합니다.
예를 들어 튜플의 요소를 분해하고 각 요소의 값을 해당 Identifier Pattern 에 바인딩 할 수 있습니다.
위의 예제에서 튜플 패턴 (x, y)의 x, y를 Identifier Pattern 에 분배합니다.
이 방식으로 인해 switch case let (x, y):와 case (let x, let y): 은 같은 동작을 합니다.
Tuple Pattern (튜플 패턴)
Tuple Pattern 은 괄호로 묶인 0 개 이상의 패턴을 쉼표로 구분 한 목록입니다. Tuple Pattern 은 해당 튜플 타입의 값과 매칭됩니다. 튜플 요소의 타입을 선언해주어서 특정 타입의 튜플과만 매칭되도록 Tuple Pattern 을 제한 할 수 있습니다. 예를 들어, let (x, y) : (Int, Int) = (1, 2) 상수 선언에서 튜플 패턴 (x, y) : (Int, Int) 은 두 요소가 모두 Int 타입인 튜플 타입입니다. Tuple Pattern 이 for-in 문이나 변수 또는 상수 선언의 패턴으로 사용될 때 Wildecard Pattern, Identifier Pattern, Optional Pattern 또는 이를 포함하는 다른 Tuple Pattern 만 포함 할 수 있습니다. 예를 들어, 튜플 패턴 (x, 0)의 요소 0이 Expression Pattern 이므로 아래 코드는 유효하지 않습니다.
단일 요소를 포함하는 Tuple Pattern 주위의 괄호는 아무 효과가 없습니다.
패턴은 단일 요소의 타입과 일치합니다. 예를 들어, 다음은 동일합니다.
Enumeration Case Pattern (열거형 케이스 패턴)
Enumeration Case Pattern 은 기존 열거형 타입과 일치합니다. Enumeration Case Pattern 은 switch 문 안에서 case 뒤에 if, while, guard, for-in 문이 있는 경우 사용됩니다.
일치시키려는 열거형에 연결된 값이있는 경우 해당 Enumeration Case Pattern 은 각 관련 값에 대해 하나의 요소가 포함된 Tuple Pattern을 지정해야합니다.
Optional Pettern (옵셔널 패턴)
Optional Pettern 은 Optional
Optional Pettern 은 Optional Enumeration Case Patterns 에 대한 더욱 더 간결하고 명확하게 표현이 가능한 문법이므로 다음은 동일합니다.
Optional Pettern 은 for-in 문에서 Optional 값의 배열을 반복할 수있는 편리한 방법을 제공합니다.
이 패턴은 루프의 본문을 nil 이 아닌 요소에만 실행합니다.
Type-Casting Patterns (타입 캐스팅 패턴들)
Type-Casting Patterns 는 is 패턴과 as 패턴이 있습니다. is 패턴은 switch 문 case 레이블에만 나타납니다.
is 및 as 패턴은 다음 형식을 갖습니다.
is 패턴은 실행 시 해당 값의 유형이 is 패턴의 오른쪽에 지정된 유형 또는 해당 유형의 서브 클래스와 동일한 경우 값과 일치합니다.
is 패턴은 is 연산자와 같이 타입 캐스트를 수행하지만리턴된 타입은 버린다는 점에서 다릅니다.
as 패턴은 실행 시 해당 값의 유형이 as 패턴의 오른쪽에 지정된 유형 또는 해당 유형의 서브 클래스와 동일한 경우 값을 찾습니다.
일치가 성공하면 일치된 값의 유형이 as 패턴의 오른쪽에 지정된 타입으로 변환됩니다.
Expression Pattern (표현식 패턴)
Expression Pattern 은 표현식의 값을 나타냅니다. Expression Pattern 은 switch 문 case 에만 나타납니다.
Expression Pattern 으로 표현된 표현식은 Swift 표준 라이브러리 ~ = 연산자를 사용하여 입력 표현식의 값과 비교됩니다. ~ = 연산자가 true를 반환하면 일치가 성공합니다. 기본적으로 ~ = 연산자는 == 연산자를 사용하여 같은 유형의 두 값을 비교합니다. 또한 다음 예에서와 같이 값이 범위에 포함되는지 여부를 확인하여 범위의 값과 값을 일치시킬 수도 있습니다.
~ = 연산자를 오버로드하여 사용자가 정의한 대로 타입을 맞출 수 있습니다. 예를 들어 위의 예제를 다시 작성하여 point 표현식을 point 의 문자열 표현식과 비교할 수 있습니다.
출처 : https://docs.swift.org/swift-book/ReferenceManual/Patterns.html#grammar_wildcard-pattern