다른 함수를 인자로 받거나, 함수를 반환하는 함수를 의미
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
//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"]
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"]