-
[Swift] 고차함수iOS/개념정리 2022. 2. 17. 17:42
고차함수는 다른 함수를 인자로 받거나 함수 실행 결과를 함수로 반환하는 함수
스위프트에서 함수(클로저)는 일급시민이다.
일급시민이란?
1. 변수나 상수에 저장 및 할당 할 수 있어야 한다.
ex)
func firstCitizen(test: String) -> String { print("first") return test } let abc = firstCitizen
2. 파라미터로 전달 할 수 있어야 한다.
ex)
func fcTest(test: String) { print("2") } fcTest(test: firstCitizen("test"))
3. 함수에서 return 할 수 있어야 한다.
ex)
func returnFunc() -> String { return firstCitizen(test: "test") }
고차 함수에는 3가지 종류가 있다.
- map
- filter
- reduce
우선 첫번째로
map
map 은 컨테이너 내부에 기존 데이터를 변형하여 새로운 컨테이너에 저장한다.
let numbers: [Int] = [0, 1, 2, 3, 4] var doubleNumbers: [Int] var strings: [String]
이렇게 3가지 상수, 변수가 있는데 여기서 numbers를 가공하면 doubleNumbers는 numbers의 각각 2배를 곱한 값을,
strings는 numbers를 string형으로 변환할 것입니다.
일단 고차함수 map을 사용하지 않으면
doubleNumbers = [Int]() strings = [String]() for number in numbers{ doubleNumbers.append(number * 2) strings.append("\(number)") } print(doubleNumbers) //[0, 2, 4, 6, 8] print(strings) //["0", "1", "2", "3", "4"]
map을 사용하면
doubleNumbers = numbers.map({ (number: Int) -> Int in return number * 2 }) strings = numbers.map({ (number:Int) -> String in return "\(number)" }) print(doubleNumbers) // [0, 2, 4, 6, 8] print(strings) //["0", "1", "2", "3", "4"]
filter
filter는 내부의 값을 걸러서 컨테이너에 추출한다.
var filtered: [Int] = [Int]() for number in numbers { if number % 2 == 0 { filtered.append(number) } } print(filtered) // [0, 2, 4]
위 방법은 filter를 사용하지 않은 방법이고 filter를 사용한 방법은 아래와 같다.
let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in return number % 2 == 0 } print(evenNumbers) //[0, 2, 4]
reduce
reduce는 콘텐츠를 하나로 통합 합니다.
우선 reduce를 사용하지 않고 통합하자면
let someNumbers: [Int] = [2, 8, 15] var result: Int = 0 for number in someNumbers { result += number } print(result) // 25
아래는 reduce를 사용한 방법입니다.
//초깃값이 0이고 someNumbers 내부의 모든 값을 더합니다. let sum: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in print("\(first) + \(second)") /* 0 + 2 2 + 8 10 + 15 */ return first + second }) print(sum) // 25
동작 과정은 주석과 같습니다.
'iOS > 개념정리' 카테고리의 다른 글
<Swift> Properties (0) 2022.02.22 <Swift> Delegate 활용 (0) 2022.02.21 <Swift> Delegate (1) 2022.01.25 <Swift> Firebase 연동 (0) 2022.01.25 Alamofire 이용한 Server 통신 (0) 2022.01.24