1. 고차 함수
•고차 함수(Higher-order function)는 '다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수'를 뜻함
•스위프트의 함수(클로저)는 일급시민(일급객체)이기 때문에 함수의 전달인자로 전달할 수 있으며, 함수의 결과값으로
반환할 수 있음
•이번 파트에서는 스위프트 표준라이브러리에서 제공하는 유용한 고차함수[map, filter, reduce]에 대해 알아봄
•map, filter, reduce 함수는 스위프트 표준 라이브러리의 컨테이너 타입(Array, Set, Dictionary 등)에 구현되어 있음
2. map
•map함수는 컨테이너 내부의 기존 데이터를 변형(transform)하여 새로운 컨테이너를 생성
1 2 3 4 5 | // 변형하고자 하는 numbers와 변형 결과를 받을 doubledNumbers, strings let numbers: [Int] = [0, 1, 2, 3, 4] var doubledNumbers: [Int] var strings: [Strings] | cs |
<<기존의 for 구문 사용>>
1 2 3 4 5 6 7 8 9 10 | doubledNumbers = [Int]() strings = [String]() for number in numbers { doubledNumbers.append(number * 2) strings.append("\(number)") } print(doubledNumbers) // [0, 2, 4, 6, 8] print(strings) // ["0", "1", "2", "3", "4"] | cs |
<<map 메서드 사용>>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // numbers의 각 요소를 2배하여 새로운 배열 반환 doubledNumbers = numbers.map({ (number: Int) -> Int in return number * 2 }) // numbers의 각 요소를 문자열로 변환하여 새로운 배열 반환 strings = numbers.map({ (number: Int) -> String in return "\(number)" }) print(doubledNumbers) // [0, 2, 4, 6, 8] print(strings) // ["0", "1", "2", "3", "4"] // 매개변수, 반환 타입, 반환 키워드(return) 생략, 후행 클로저 doubledNumbers = numbers.map { $0 * 2 } print(doubledNumbers) // [0, 2, 4, 6, 8] | cs |
3. filter
•filter함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출
<<기존의 for 구문 사용>>
1 2 3 4 5 6 7 8 9 10 | // 변수 사용에 주목 var filtered: [Int] = [Int]() for number in numbers { if number % 2 == 0 { filtered.append(number) } } print(filtered) // [0, 2, 4] | cs |
<<filter 메소드 사용>>
1 2 3 4 5 6 7 8 9 10 11 | // numbers의 요소 중 짝수를 걸러내어 새로운 배열로 반환 let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in return number % 2 == 0 } print(evenNumbers) // [0, 2, 4] // 매개변수, 반환 타입, 반환 키워드(return) 생략, 후행 클로저 let oddNumbers: [Int] = numbers.filter { $0 % 2 != 0 } print(oddNumbers) // [1, 3] | cs |
4. reduce
•reduce 함수는 컨테이너 내부의 콘텐츠를 하나로 통합
1 2 | // 통합하고자 하는 someNumbers let someNumbers: [Int] = [2, 8, 15] | cs |
<<기존의 for 구문 사용>>
1 2 3 4 5 6 7 8 9 | // 변수 사용에 주목하세요 var result: Int = 0 // someNumbers의 모든 요소를 더합니다 for number in someNumbers { result += number } print(result) // 25 | cs |
<<reduce 메서드 사용>>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // 초깃값이 0이고 someNumbers 내부의 모든 값을 더합니다. let sum: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in //print("\(first) + \(second)") //어떻게 동작하는지 확인해보세요 return first + second }) print(sum) // 25 // 초깃값이 0이고 someNumbers 내부의 모든 값을 뺍니다. var subtract: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in //print("\(first) - \(second)") //어떻게 동작하는지 확인해보세요 return first - second }) print(subtract) // -25 // 초깃값이 3이고 someNumbers 내부의 모든 값을 더합니다. let sumFromThree = someNumbers.reduce(3) { $0 + $1 } print(sumFromThree) // 28 | cs |
제 나름대로 생각을 정리하며 포스팅합니다.
정보전달에 있어 차질이 생기는 것을 우려해 나름대로 확실하게 검증을 하고 포스팅하려고 노력합니다.
본 포스팅에 잘못된 정보가 있거나 수정해야할 내용이 있다면 댓글 또는 아래의 이메일로 알려주시면 감사하겠습니다.
E-mail : silent_lhr@naver.com
공감은 로그인이 필요없습니다.
공감은 저에게 포스팅을 이어나갈 수 있는 힘이 됩니다.