티스토리 뷰

Swift/야곰의 스위프트

25장 패턴

할루루 2018. 4. 28. 23:51

[시작]


- 패턴에 익숙해지면 코드의 양을 줄이면서 문법을 더 잘 활용할 수 있게 된다.

- 패턴 : 단독 또는 복합 값의 구조를 나타내는 것

- 패턴 매칭 : 코드에서 어떤 패턴의 형태를 찾아내는 행위

- 대부분의 패턴은 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




<패턴 매칭을 위한 패턴>

[열거형 케이스 패턴]

- 값을 열거형 타입의 case와 매치시킴
- switch 구문의 case 레이블과 if, while, guard, for-in 구문의 case 조건에서 볼 수 있다.
- 연관 값이 있는 열거형 케이스와 매치하려고 한다면 열거형 케이스 패턴에는 반드시 튜플 패턴이 함께해야 한다.

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 패턴은 switchcase 레이블에서만 사용할 수 있다.

- 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?")

}




[표현 패턴]

- 표현식의 값을 평가한 결과를 이용
- switch 구문의 case 레이블에서만 사용 가능
- ~= 연산자의 연산 결과가 true이면 매치시킨다.
- ~= 연산자를 재정의하여 자신이 원하는대로 패턴을 완성시킬 수 있다...


'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
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함