# 함수형 프로그래밍 3 - 맵, 필터, 리듀스 [스위프트]

인생노잼시기·2021년 6월 13일
0

🦅 스위프트 문법

목록 보기
8/13

맵, 필터, 리듀스

15.1 맵Map

Sequence, Collection 프로토콜을 따르는 타입과 옵셔널은 모두 맵을 사용할 수 있다
기존 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 생성되어 반환된다
다중 스레드 환경일 때,
대상 컨테이너의 값이 스레드에서 변경되는 시점에 다른 스레드에서도 동시에 값이 변경되려고 할 때 예측치 못한 결과가 발생하는 부작용을 방지할 수도 있습니다.

💡 배열에서의 map, filter, reduce
💡 컬렉션 타입(세트, 딕셔너리 등)에서의 map, filter, reduce
💡 딕셔너리 키에 해당하는 값을 위한 mapValue, compactMapValue, flatMapValue

let numbers: [Int] = [0, 1, 2, 3, 4]

var doubledNumbers: [Int] = [Int]()
var strings: [String] = [String]()

doubledNumbers = numbers.map({ (number: Int) -> Int in
    return number * 2       //[0, 2, 4, 6, 8]
})
strings = numbers.map({ (number: Int) -> String in
    return "\(number)"      //["0", "1", "2", "3", "4"]
})
//기본
doubledNumbers = numbers.map({ (number: Int) -> Int in
    return number * 2
})

//타입 생략
doubledNumbers = numbers.map({ (number) in
    return number * 2
})

//반환 타입 생략
doubledNumbers = numbers.map({ return $0 * 2 })

//반환 키워드  생략
doubledNumbers = numbers.map({ $0 * 2 })

//후행 클로저 사용
doubledNumbers = numbers.map { $0 * 2 }
let evenNumber: [Int] = [0, 2, 4, 6, 8]
let oddNumber: [Int] = [1, 3, 5, 7, 9]
let multiplyTwo: (Int) -> Int = { $0 * 2}

let doubledEvenNumber = evenNumber.map(multiplyTwo)
let doubledOddNumber = oddNumber.map(multiplyTwo)

15.2 필터Filter

let numbers: [Int] = [0, 1, 2, 3, 4, 5]

let oddNumbers: [Int] = numbers.filter { $0 % 2 == 0 }  //[0, 2, 4]

let newNumbers: [Int] = numbers.map{ $0 + 3 }.filter { $0 % 2 == 0 }    //[4, 6, 8]

15.3 리듀스Reduce

결합Combine
초깃값이 주어진다.

let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7]

var result: Int = numbers.filter { $0.isMultiple(of: 2) }.map{ $0 * 3 }.reduce(0) { $0 + $1 }
print(result)   //36

var array = [1,2,3,4]
array.reduce(0, +) // 숫자 합이 나타남. 문자열 합치기도 가능
profile
인생노잼

0개의 댓글