[swift] 기초문법 - 맵(Map), 필터(Filter), 리듀스(Reduce), 모나드(Monad), 플랫맵(FlatMap)
스위프트의 대표적인 고차함수로 맵(Map), 필터(Filter), 리듀스(Reduce)가 있다.
(고차함수 : 매개변수로 함수를 갖는 함수를 말함)
맵(Map)
컨테이너가 담고 있던 각각의 값을 매개변수를 통해 받은 함수에 적용한 후 새로운 컨테이너를 생성하여 반환 (기존 컨테이너의 값은 변경되지 않음)
시퀀스(Sequence), 콜렉션(Collection) 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용할 수 있다. (배열, 딕셔너리, 세트, 옵셔널)
for-in 구문 사용하는것과 비슷하나 코드가 더 간결하고 컴파일러 차원에서 성능 차이가 있다.
array example :
let array = [0, 1, 2, 3]
let newArray = array.map { $0 * 5 }
print(newArray) //[0, 5, 10, 15]
dictionary example :
let dictionary = ["key1":"value1", "key2":"value2"]
let keys = dictionary.map { $0.0 }
let values = dictionary.map { $0.1 }
print(keys) //["key1", "key2"]
print(values) //["value1", "value2"]
let keys2 = dictionary.map { $0.0 + "a" }
let values2 = dictionary.map { $0.1 + "b" }
print(keys2) //["key1a", "key2a"]
print(values2) //["value1b", "value2b"]
필터(Filter)
반환타입이 Bool인 매개변수 함수 의 결과가 true면 새로운 컨테이너에 값을 담아 반환
let array = [0, 1, 2, 3]
let filteredArray = array.filter { $0%2 == 0 }
print(filteredArray) //[0, 2]
리듀스(Reduce)
매개변수로 전달받은 함수의 연산 결과로 각 배열의 모든 값을 합침
initial 매개변수로 초기값 세팅
let array = [0, 1, 2, 3]
let newArray = array.reduce(0) { $0 + $1 }
print(newArray) //6
let charArray = ["a", "b", "c", "d"]
let charNewArray = charArray.reduce("result is ") { $0 + $1 }
print(charNewArray) //result is abcd
모나드(Monad)
값이 있을 수도 있고 없을 수도 있는 컨텍스트를 가지는 함수객체타입이며, 함수객체와 모나드는 특정 기능이 아닌 디자인 패턴 혹은 자료구조라고 할 수 있다.
컨텍스트(Context)
옵셔널처럼 값이 옵셔널 타입으로 감싸져있듯이 값을 담는 컨테이너 역할을 하는것
함수객체
맵을 적용할 수 있는 컨테이너 타입 (array, dictionary, set 등 컬렉션 타입들)
플랫맵(FlatMap)
맵과 사용법이 같음
컨테이너로 쌓여져있으면 컨테이너 안의 값으로 작업을 수행하여 다시 포장하여 반환
플랫맵은 체인 형식으로 사용 가능하나 맵은 불가능 (optionals.flatMap{ $0 }.flatMap{ $0 })
let optionals: [Int?] = [0, 1, 2, nil, 4]
let map = optionals.map { $0 }
let flatMap = optionals.flatMap { $0 }
print(map) // [Optional(0), Optional(1), Optional(2), nil, Optional(4)]
print(flatMap) //[0, 1, 2, 4]
#swift 기초
#swift 강의
#ios programming
'IT > Swift' 카테고리의 다른 글
[swift] Inheritance (0) | 2019.09.22 |
---|---|
[swift] Subscript (0) | 2019.09.19 |
[swift] Architecture mvc/mvp/mvvm/viper/vip 비교 (0) | 2019.08.21 |
[swift] swift5 (0) | 2019.08.21 |
[swift] guard (0) | 2019.08.21 |