일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 사이드프로젝트10개기술스택으로구현하는풀스택서버리스프로젝트withReact
- 오공완
- 연결리스트삭제
- 연결리스트삽입
- 패캠챌린지
- eventbubbling
- stopPropagation
- 프로그래머스
- 자료구조
- 패캠인강후기
- ios
- swift
- 환급챌린지
- 패스트캠퍼스후기
- hig
- Components
- 코딩테스트
- MVMM
- 이벤트버블링
- 연결리스트생성
- eventcapturing
- 이벤트캡처링
- 직장인자기계발
- 스위프트
- HTML
- JavaScript
- 수강료0원챌린지
- 실패율
- 직장인인강
- 패스트캠퍼스
- Today
- Total
날쌘 개발자
고차함수 본문
고차함수
고차함수(Higher-order function)란,
다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수
라고 한다.
스위프트에서 제공하는 고차함수에는 Map, Filter, Reduce가 있는데, 코딩테스트 문제를 풀때 다른 사람들이 푼 방법중 간결한 코드에는 항상 포함되어있었던것이 기억에 남는다.
이놈들은 스위프트 표준 라이브러리의 컨테이너 타입인 Array, Set, Dictionary 등에 구현되어 있다.
Map
map(변형)함수는 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 만든다.
이때 기존의 컨테이너는 변경되지 않는다!
기존의 for - in 구문과 유사하지만, 보다 코드가 간결해지고, 재사용이 용이해지며, 컴파일러 최적화 시 성능이 좋아진다는 장점이 있다.
먼저 map 메소드의 기본 형태는 다음과 같다.
array.map(transform: (element) throws -> T)
예시 코드를 보며 이해해보자면
let numbers: [Int] = [0, 1, 2, 3, 4]
var doubleNumbers: [Int]
doubleNumbers = [Int]()
for number in numbers {
doubleNumbers.append(number * 2)
}
print(doubleNumbers) // [0, 2, 4, 6, 8]
let numbers: [Int] = [0, 1, 2, 3, 4]
var doubleNumbers: [Int]
doubleNumbers = numbers.map({ (number: Int) -> Int in
return number * 2
})
print(doubleNumbers) // [0, 2, 4, 6, 8]
numbers배열의 각 요소를 2배하여 새로운 배열로 반환하는 동작을
위의 코드는 for - in 구문으로, 밑의 코드는 map 메소드를 사용하여 구현한 것이다.
간단한 동작이기에 map메소드를 썼음에도 불구하고 코드가 그리 간결해지지 않아 보일수 있는데,
map메소드를 사용하는 문장에서 매개변수, 반환 타입, 반환 키워드(return)를 생략할 수 있다.
doubleNumbers = numbers.map({ (number: Int) -> Int in
return number * 2
}) // <- 이 코드를
doubleNumbers = numbers.map { $0 * 2 }
//이렇게 생략할 수 있다.
Filter
filter함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출한다.
쉽게 말해 데이터를 추출할때 사용한다는 것이다.
먼저 filter메소드의 기본형태는 다음과 같다.
array.filter(isIncluded: (element) throws -> T)
filter메소드의 반환타입은 Bool 인데,
true이면 새 컨테이너에 값을 포함하고, false이면 값을 배제한다.
예시를 보며 이해해보자
let numbers: [Int] = [0, 1, 2, 3, 4]
var filtered: [Int] = [Int]()
for number in numbers {
if number % 2 == 0 {
filtered.append(number)
}
}
print(filtered) // [0, 2, 4]
let numbers: [Int] = [0, 1, 2, 3, 4]
let evenNumbers: [Int] = numbers.filter {(number: Int) -> Bool in
return number % 2 == 0
}
print(evenNumbers) // [0, 2, 4]
위의 map메소드와 마찬가지로 매개변수, 반환 타입, 반환 키워드를 생략할 수 있다.
let evenNumbers: [Int] = numbers.filter {(number: Int) -> Bool in
return number % 2 == 0 // 이 코드를
let evenNumbers: [Int] = numbers.filter {
$0 % 2 == 0
} // 이렇게 생략
Reduce
reduce메소드는 컨테이너 내부의 요소들을 하나로 통합한다.
let someNumbers:[Int] = [2, 8, 15]
var result: Int = 0
for number in someNumbers {
result += number
}
print(result) // 25
let someNumbers:[Int] = [2, 8, 15]
let sum: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
return first + second
})
여기서 reduce뒤의 0은 초기값에 해당하고,
first는 초기값에서 출발하여 마지막 요소까지 순회하는 내내의 결과값에 해당하며,
second는 현재 순회하는 요소의 값에 해당한다.
위의 map, filter와 마찬가지로 생략가능하다
let someNumbers:[Int] = [2, 8, 15]
let sum: Int = someNumbers.reduce(0){$0 + $1}
print(sum)
참고한 내용
https://yagom.github.io/swift_basic/contents/22_higher_order_function/
'ios > 기본문법' 카테고리의 다른 글
components / split (0) | 2022.04.01 |
---|---|
소문자 대문자 (0) | 2022.04.01 |
스위프트 기본문법 (5) (0) | 2021.07.09 |
스위프트 기본문법 (4) (0) | 2021.07.09 |
스위프트 기본문법 (3) (0) | 2021.07.09 |