본문 바로가기

iOS 앱 개발자 프로젝트

[Swift] Closure 매개변수에 사용된 와일드카드 패턴

2024년 4월 3일 수요일 (영원한 아기판다가 떠난 푸중절.. 늘 건강해야해 푸곰쥬..

 

평소 의식하지 못한 채 사용하는 많은 패턴들 중 와일드카드 패턴을 closure 사례를 통해 복습하며 익혀 봅니다.

 

※ 와일드카드 패턴은 유닉스 시스템의 초기(1971년)부터 사용되어 온 오래된 개념으로,

다양한 프로그래밍 및 검색 작업에서 유용하게 사용되고 있다.


패턴의 종류

 

  • 값을 해체(추출)하거나 무시하는 패턴
    와일드카드 패턴, 식별자 패턴, 바인딩 패턴, 튜플 패턴 ...

  • 패턴 매칭을 위한 패턴
    - 열거형 케이스 패턴, 옵셔널 패턴, 표현 패턴, 타입캐스팅 패턴 ...

 

Swift 언어에서의 와일드카드 패턴

 

"와일드카드 식별자가 위치한 곳의 값은 무시한다. "

 

밑줄( _ )로 표현되며, 코드 내에서 특정 값을 해체하거나 무시해야 할 때 유용하게 사용된다. 밑줄의 자리에 올것이 무엇이든 상환하지 말라는 뜻으로 for 구문이나 switch 구문에 많이 사용된다.

 

 

고차함수의 클로저에서 사용 ($0)

 

클로저에서 사용하는 와일드카드를 사용한, 결과는 동일하지만 작성하는 방식이 다른 아래의 코드를 비교해 보자.

 

 

#1. 간결함보다 가독성을 중시한, 직관적인 방식

let friends : [(name: String, age: Int)] = [("Nayeon", 22), ("Maggie", 24), ("Jenny", 30)]
let result = friends.filter{ $0.name != "Nayeon" }
print(result)

 

$0.name != "Nayeon"을 사용하여 필터링을 했다. 클로저 내에서 $0를 사용하여 간단하게 요소의 name 속성에 접근!

 

 

#2. 패턴 매칭 - 명시적으로 요소를 처리

let friends = [("Nayeon", 22), ("Maggie", 24), ("Jenny", 30)]
let result = friends.filter {(name, _) in if name == "Nayeon" {return false} else {return true} }
print(result)

 

클로저 내에서 튜플의 첫 번째 요소(이름)와 두 번째 요소(나이)를 분리하여 받고 있으며, 이름이 "Nayeon"인 경우에는 false를 반환하여 해당 요소를 필터링 결과에서 제외하고, 그렇지 않은 경우에는 true를 반환하여 필터링 결과에 포함했다. 

 

 

#3. 첫 번째 요소에 직접 접근하여 필터링하는 방식 - 튜플 구조를 명확히 이해한다면 유용하다. 

let friends = [("Nayeon", 22), ("Maggie", 24), ("Jenny", 30)]
let result = friends.filter{ $0.0 != "Nayeon" }
print(result)

 

$0.0 != "Nayeon" 사용하여 "Nayeon"이 아닌 요소들을 필터링하고 result 배열에 저장한 후 출력하는 코드. 배열의 첫 번째 요소인 이름에 바로 접근했다. 즉 $0.name이 아닌 $0.0으로 표현했다. 

 

 

 

위의 세 가지 코드 모두 "Nayeon"을 제외한 나머지 친구들의 이름과 나이가 튜플 형태로 배열에 저장되어 출력된다.

[("Maggie", 24), ("Jenny", 30)]

 

 

 

※ 함수는 클로저의 일종이다. 가끔 클로저가 더 작은 개념같지만 클로저가 더 넓은 개념이라는 것을 기억하자.