본문 바로가기

IT/Swift

[swift] Map, Filter, Reduce, Monad, FlatMap

[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