고차함수

JG Ahn·2024년 11월 12일

swift 심화

목록 보기
11/18
post-thumbnail

고차함수란?

다른 함수를 인자로 받거나, 함수를 반환하는 함수를 의미

  • Swift는 일급 객체를 지원하므로, 함수를 인자로 넘기거나 반환값으로 사용해 효율적이고 간결한 코드를 작성할 수 있다
  • 컬렉션타입에서 사용되는 다양한 고차함수를 통해 데이터를 변환, 필터링, 축소하는 작업을 간편하게 수행

map

  • 배열의 각 요소를 변환하여 새로운 배열 생성
  • 각 요소를 변형하는 작업을 반복하며, 변형된 값을 새로운 배열로 반환
let numbers = [1, 2, 3, 4]
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers)  // [1, 4, 9, 16]

// 만약 map이 없었다면
/*
let numbers = [1, 2, 3, 4]
var squaredNumbers = [Int]()
for number in numbers {
		squaredNumbers.append(number * number) 
}
*/

filter

  • 배열에서 주어진 조건에 맞는 요소들만 걸러내 새로운 배열로 반환

[공식문서 정의]

func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]

요소의 조건문 해당 여부에 대한 Bool값을 리턴

let numbers = [1, 2, 3, 4, 5, 6]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)  // [2, 4, 6]

reduce

  • 배열의 모든 요소를 하나로 합쳐 하나의 값을 반환
  • 초기값 입력 필요
let numbers = [1, 2, 3, 4]
let sum = numbers.reduce(0) { $0 + $1 } 
// reduce(0)은 초기값을 0으로 $0에는 합쳐진 값을 갖고 있고 $1에는 배열의 값이 들어감
print(sum)  // 10

compactMap

  • 옵셔널을 언래핑하고 nil을 제거한 배열 반환
//map과 compactMap 비교
let possibleNumbers = ["1", "2", "three", "///4///", "5"]

//map 사용
let mapped = possibleNumbers.map { str in Int(str) }
print(mapped)//결과: [Optional(1), Optional(2), nil, nil, Optional(5)]

//compactMapped 사용
let compactMapped = possibleNumbers.compactMap { str in Int(str) }
print(compactMapped)//결과: [1, 2, 5]

flatMap

  • 중첩된 컬렉션을 평평하게 만드는데 사용 (2차원 배열 ➡️ 1차원 배열)
let nestedArray = [[1, 2, 3], [4, 5], [6, 7, 8]]
let flatArray = nestedArray.flatMap { $0 }
print(flatArray)  // [1, 2, 3, 4, 5, 6, 7, 8]

zip

  • 두 개의 시퀀스를 하나의 튜플 시퀀스로 결합
let numbers = [1, 2, 3, 4]
let letters = ["A", "B", "C"]

let zipped = zip(numbers, letters)

for pair in zipped {
    print(pair)
}

/* 결과
(1, "A")
(2, "B")
(3, "C")
*/

응용

  • zip으로 묶은 후 map 사용
let numbers = [1, 2, 3]
let letters = ["A", "B", "C"]

let combined = zip(numbers, letters).map { "\($0)\($1)" }
print(combined) // ["1A", "2B", "3C"]
  • key와 value를 두 개의 배열로 나누어 Dictionary 만들기
let keys = ["name", "age", "city"]
let values = ["Alice", "25", "Seoul"]

let dictionary = Dictionary(uniqueKeysWithValues: zip(keys, values))
print(dictionary) // ["name": "Alice", "age": "25", "city": "Seoul"]

0개의 댓글