🌟 Swift
의 표준 배열 라이브러리는 map
, filter
, reduce
라는 세 가지 기능을 제공
func map<U>(transform: (T) -> U) -> Array<U>
[x1, x2, ... xn].map(f) -> [f(x1), f(x2), ... , f(xn)]
//[1, 2, 3, 4]인 배열에서 2씩 곱한 배열을 얻는 예제
let array = [1, 2, 3, 4]
let multipliedArray = array.map( { (value: Int) -> Int in return value * 2 } )
// [2, 4, 6, 8]
//value의 타입 Int와 return 키워드는 추론을 통해 생략 가능
array.map( { (value) -> Int in value * 2 } )
//-> Int도 생략 가능
array.map( {value in value * 2 } )
//value는 여러번 사용하므로 $0으로 축약
array.map( {$0 * 2} )
//괄호도 생략 가능
array.map { $0 * 2 }
//만약 값에 문자열 “Number : “를 붙인다면 다음과 같이 사용
array.map{ "Number : \($0 * 2)" }
func filter(includeElement: (T) -> Bool) -> Array<T>
includeElement
를 지원하는 클로저는 항목이 포함되는지(true
) 또는 제외되는지(false
) 나타내기 위해 Boolean
값을 반환해야 함//array의 짝수 값 항목만 가지는 배열을 얻는 예제
let array = [1, 2, 3, 4]
let evenArray = array.filter( { (value: Int) -> Bool in return (value % 2 == 0) } )
//[2, 4]
//앞에서 했던 생략 방식으로 아래와 같이 축약 가능
array.filter { $0 % 2 == 0 }
func reduce<U>(initial: U, combine: (U, T) -> U) -> U
//sum 구현해보기
array.reduce(0, { (s1: Int, s2: Int) -> Int in
return s1 + s2
})
//클로저는 함수의 마지막에 위치하면 다른 인자와 분리하여 작성할 수 있음
array.reduce(0) { (s1: Int, s2: Int) -> Int in
return s1 + s2
}
//s1, s2의 타입은 추론하므로 생략 가능
array.reduce(0) { (s1, s2) in s1 + s2 }
//s1과 s2는 $0, $1로 대신하여 사용
array.reduce(0) { $0 + $1 }
//연산자는 중위 연산자로 왼쪽 값이 $0, 오른쪽 값이 $1임을 추론 가능하므로 다음과 같이 생략 가능
array.reduce(0, +)
만일 initial
값이 0
이라면 초기 항목은 {0 + 1}
.
값이 1
이라면 {1 + 1}
클로저
는 이전 결과
와 다음 항목
을 계속 호출
하여 다음과 같은 과정을 거쳐 하나의 값
을 얻음
{0 + 1}
, {1 + 2}
, {3 + 3}
, {6 + 4}
이며, 결과는 10