Swift | map, flatMap, compactMap

회사에서 일할 때도 애매하게 했갈렸던 = 내가 이해가 완벽하지 않았던 이 애매한 3가지를 정리해보려 한다.
이 블로그 글을 게시할 때에는 완벽하게 이해하고 적적하게 사용할 수 있기를 바라며 🙏💫

Swift의 고차함수

parameter(매개변수)로 함수를 받는 함수를 고차함수라 한다.

?????????
😇,, 함수에 함수를 넣는다는 개념이 어려울 수 있지만 코드로 이해하면 쉽게 알 수 있다.

// 1.
func sumNumbers(num1: Int, num2: Int) -> Int {
    return num1 + num2
}

1과 같은 함수가 있을때 매개변수는 num1과 num2. 두 개가 존재하고 있다.
이 두 가지 Int 타입의 매개변수가 함수로 정의된 함수가 고차함수이다.

이 글에서 설명하려고 하는 map, flatMap, compactMap 모두 Sequence라는 protocol에서 정의된 고차함수이다.

✔️즉, Sequence protocol을 따르는 타입은 map, flatMap, compactMap을 사용할 수 있다.

map

func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]

각각의 값을 변경하고자 할 때 사용.

활용 예

– 기존의 배열에서 값을 제외하거나 추가하지는 않고, 존재하는 값을 변형시킬 때.

Examples

// 1. Int 로 구성된 배열의 값을 각각 1씩 더할 때.
let numbers: [Int] = [0, 1, 2, 3, 4, 5]
let newNumbers: [Int] = numbers.map { $0 + 1 }

print(newNumbers) // [1, 2, 3, 4, 5, 6]


// 2. String 으로 구성된 배열의 값을 모두 대문자로 변경할 때.
let names: [String] = ["james", "john", "lisa"]
let uppercasedNames: [String] = names.map { $0.uppercased() }

print(uppercasedNames) // ["JAMES", "JOHN", "LISA"]

flatMap

func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence

2차 배열을 1차 배열로 만들고 싶을 때
– 1차 배열 : [1, 2, 3, 4, 5, 6]
– 2차 배열 : [[1], [2, 3, 4], [5], [6]]

활용 예

let classMates: [[String]] = [["james", "john", "lisa"], ["kim"], ["lee", "pengsoo"]]
let classMateNames: [String] = classMates.flatMap { $0 }

print(classMateNames) // ["james", "john", "lisa", "kim", "lee", "pengsoo"]

compactMap

func compactMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

옵셔널이 포함된 배열에서 nil을 제거하고 옵셔널 바인딩을 할 때 사용.

활용 예

let names: [String?] = ["james", nil, "john", nil, "lisa"]
let nonOptionalNames: [String] = names.compactMap { $0 }

print(nonOptionalNames) // ["james", "john", "lisa"]

번외
하나의 배열에 2가지 이상의 고차함수를 활용할 수도 있다.

let numbers: [[Int?]] = [[nil], [1, nil], [2, 3]]

// numbers를 옵셔널이 없는 1차 배열로 만들어보자.
let newNumbers: [Int] = numbers
    .flatMap { $0 }
    .compactMap { $0 }

print(newNumbers)

즐거운 iOS 개발 되세용 🐟💦

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중