-
Notifications
You must be signed in to change notification settings - Fork 0
Description
고차함수
swift 뿐만 아니라 함수형 프로그래밍을 지향하는 언어들에 기본적으로 구현되어 있음
오늘 살펴볼 고차함수들은 map, filter, reduce, forEach, compactMap, flatMap임.
기본적으로 알고 있는 것들이지만 RxSwift에서 Transforming Operator로 사용하기 때문에 다시 짚고 넘어가겠음
map
기존 배열 등의 각 아이템을 새롭게 매핑해서 새로운 배열을 리턴하는 함수
각 아이템을 매핑해서, 변형해서 새로운 배열을 만들때 사용
let numbers = [1, 2, 3, 4, 5]
newNumbers = numbers.map { "숫자: \($0)" }Observable.from([organization])
.map { organization -> URL in
return URL(string: "https://api.github.com/orgs/\(organization)/repos")!
}
.map { url -> URLRequest in
var request = URLRequest(url: url)
request.httpMethod = "GET"
return request
}filter
기존 배열 등의 각 아이템을 조건을 확인후, true를 새로운 배열에 담아 리턴
각 아이템을 필터링해서, 걸러내서 새로운 배열을 만들때 사용
let array = [1, 2, 3, 4, 5, 6, 7, 8]
evenNumersArray = array.filter { $0 % 2 == 0 } .filter { response, _ in
return 200..<300 ~= response.statusCode
}reduce
기존 배열 등의 각 아이템을 클로저가 제공하는 방식으로 결합해서 마지막 결과값을 리턴
초기값 제공 필수임
각 아이템을 결합해서 단 하나의 값으로 리턴
var numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var resultSum = numbersArray.reduce(0) { (sum, num) in
return sum + num
}map / filter / reduce의 활용
간단한 예시를 살펴보겠음.
아래 배열에서 홀수만 제곱해서, 그 숫자를 다 더하려면 어케할거임?
numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var newResult = numbersArray
.filter { $0 % 2 != 0 }
.map { $0 * $0 }
.reduce(0) { $0 + $1 }forEach
addSubViews의 존재를 알기 전까지 지독하게 사용했던 녀석임
기존 배열 등의 각 아이템을 활용해서 각 아이템별로 특정 작업을 실행
각 아이템을 활용해서 각각 특정 작업을 실행할때 사용
[navigationView, scrollView].forEach {
addSubview($0)
}이런 식으로 addSubView 할 때 써줄 수 있을거임
compactMap
기존 배열 등의 각 아이템을 새롭게 매핑해서 변형하되, 옵셔널 요소는 제거하고, 새로운 배열을 리턴
map + 옵셔널제거 <- 이게 핵심임
옵셔널 바인딩 기능 내장
let stringArray: [String?] = ["A", nil, "B", nil, "C"]
var newStringArray = stringArray.compactMap { $0 }print를 찍어보면 ["A", "B", "C"] 가 출력될거임
compactMap은 걍 옵셔널을 거르고 새로운 배열 리턴하는 거라 생각하면 됨
compactMap을 filter와 map으로 만들자면 아래와 같이 만들 수 있음
newStringArray = stringArray.filter { $0 != nil }.map { $0! }flatMap
중첩된 배열의 각 배열을 새롭게 매핑해서 내부 중첩된 배열을 제거하고 리턴
var nestedArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(nestedArray.flatMap { $0 })print문의 결과는 [1, 2, 3, 4, 5, 6, 7, 8, 9] 출력
var newNnestedArray = [[[1,2,3], [4,5,6], [7, 8, 9]], [[10, 11], [12, 13, 14]]]
var numbersArray = newNnestedArray
.flatMap { $0 }
.flatMap { $0 }[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 이렇게 출력될거임.
.flatMap { request -> Observable<(response: HTTPURLResponse, data: Data)> in
return URLSession.shared.rx.response(request: request)
}걍 중첩된 배열 제거하는 용도라고 생각하셈