본문 바로가기

Language/Swift

Swift map, filter, reduce

반응형

 스위프트에는 함수형 프로그래밍에서 많이 사용하는 Map, Filter, Reduce를 사용할 수 있다.

세가지 컬렉션은 주로 배열의 요소들을 쉽게 접근 및 연산할때 많이 사용한다. 또한 참조한 배열의 값들을 직접 건드리는 일 없이 오로지 값 복사를 통해 새로운 배열을 반환하기 때문에 비동기처리에도 안전하게 사용할 수 있다.

 

1. map

먼저 맵 같은 경우에는 각 요소들을 접근하여 연산 처리를 할 때 주로 쓰인다.

let numbers: [Int] = [0,1,2,3,4,5,6,7,8,9,10]

let mappedNumbers = numbers.map { (myElement : Int) -> Int in
	return myElement * 10
}

print(mappedNumbers)
// [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

여기서 myElement는 numbers의 각 요소들이며 각각 X 10 연산한 결과값을 mappedNumbers 배열에 append 해준다.

 

2. filter

필터는 말 그대로 조건에 부합한지 판단한지 확인하여 필터링한다. 반환값은 Bool로 지정되어 있으며 조건에 부합하면 true를 반환하여 새로운 배열에 요소를 추가해준다.

let numbers : [Int] = [0,1,2,3,4,5,6,7,8,9,10]

let filteredNumbers = numbers.filter { (number : Int) -> Bool in
	return number % 2 == 0
}

print(filteredNumbers)

// 0, 2, 4, 6, 8, 10

 

3. reduce

리듀스는 영어로 줄이다라는 뜻인데 네이밍이 조금 잘못된거같다. 초기값을 사용한다는 면에서 줄이다보단 합치다?가 맞지않을까 싶다.

// reduce Ver 1

let numbers = [0,1,2,3,4,5,6,7,8,9,10]

let subRactNumbers = numbers.reduce(10, { (result, next) -> Int in
	return result - next
})

print(subRactNumbers)

// 10은 초기값이므로 처음에는 result에 10이 세팅된다
// next는 numbers의 각 요소들을 뜻한다.



// reduce Ver 2

let numbers2 = [4, 5, 6]

let doubleNumbers = numbers.reduce(into: [1, 2, 3], { (result: inout [Int], next : int) in
	if next % 2 == 1 {
    	return
    }
    result.append(next * 2)
})

print(doubleNumbers)
// 1,2,3,10

// into: [1,2,3]은 배열의 초기값을 뜻한다.
// result는 새로운 배열을 뜻한다.
// next는 numbers2의 각 요소들을 뜻한다

 

반응형

'Language > Swift' 카테고리의 다른 글

Swift 클로저  (0) 2020.07.17
Swift 구조체와 클래스의 차이  (0) 2020.07.16