Swift문법 - (23)고차함수

Youth·2022년 10월 17일
0

swift문법공부

목록 보기
23/27

고차함수(map, filter, reduce)

  • 추가적으로 : forEach, compactMap, flatMap

1. map함수

  • 기존 배열 등의 각 아이템을 새롭게 매핑해서 새로운 배열을 리턴하는 함수
  • 각 아이템을 매핑해서, 변형해서 새로운 배열을 만들때 사용
let numbers = [1, 2, 3, 4, 5]

1번방법
var newNumbers = numbers.map { (num) in
    return "숫자: \(num)"
}

2번방법
클로저에서 파라미터와 in을 같이 생략하고 $0을 넣어줌
한줄이라면 return도 생략해도됨
newNumbers = numbers.map { "숫자: \($0)" }

-> 1번방법 2번방법 모두 똑같은 결과

2. filter함수

  • 기존 배열 등의 각 아이템을 조건을 확인후, 참(true)을 만족하는 아이템을 걸러내서 새로운 배열을 리턴
  • 각 아이템을 필터링해서, 걸러내서 새로운 배열을 만들때 사용
Case1. 이름거르기

let names = ["Apple", "Black", "Circle", "Dream", "Blue"]

var newNames = names.filter { (name) -> Bool in
    return name.contains("B")
}
print(newNames) //["Black", "Blue"]

클로저를 줄여보면 우선 return타입과 input과 in은 생략이 가능하다

var newNames2 = names.filter { $0.contains("A") }
print(newNames2) //["Apple"]
Case2. 숫자거르기

let array = [1, 2, 3, 4, 5, 6, 7, 8]

var evenNumersArray = array.filter { num in
    return num % 2 == 0
}

evenNumersArray = array.filter { $0 % 2 == 0 }

✅조건을 함수로 전달해보기✅
func isEven(_ i: Int) -> Bool {
    return i % 2 == 0
}

array의 요소를 isEven에 input으로 주는 느낌
let evens = array.filter(isEven(_:))
// let evens = array.filter(isEven)도 가능
print(evens)

3. reduce함수

  • 기존 배열 등의 각 아이템을 클로저가 제공하는 방식으로 결합해서
    마지막 결과값을 리턴(초기값 제공할 필요있음)
  • 각 아이템을 결합해서 단 하나의 값으로 리턴
var numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

누적을 하기때문에 초기값이 필요하다
var resultSum = numbersArray.reduce(0) { (a, b) in
    return a + b
}
첫번째
0을 a에다가 넣는다, 배열의 첫번째 요소를 b에 넣는다 더한값이 초기값에 넣는다
두번째
(첫번째 결과가 초기값에 있다) 첫번째결과를 a에다가 넣고 두번째요소를 b에다 넣는다 더한값을 초기값에 넣는다

resultSum = numbersArray.reduce(100) { $0 - $1 }
100에서 첫번째요소를 빼서 초기값에 넣는다(99)
99에서 두번째요소를 빼서 초기값에 넣는다(97)
97에서 세번째요소를 뺴서 초기값에 넣는다(94)

map, filter, reduce의 활용

numbersArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

// 위의 배열 중에, 홀수만 제곱해서, 그 숫자를 다 더한 값은?

var newResult = numbersArray
                        .filter { $0 % 2 != 0 }
                        .map { $0 * $0 }
                        .reduce(0) { $0 + $1 }

print(newResult)

4. forEach함수

  • 기존 배열 등의 각 아이템을 활용해서
    각 아이템별로 특정 작업을 실행
  • 각 아이템을 활용해서 각각 특정 작업을 실행할때 사용
let immutableArray = [1, 2, 3, 4, 5]

var sum = 0

immutableArray.forEach { sum += $0 }

5. compactMap함수

  • 기존 배열 등의 각 아이템을 새롭게 매핑해서 변형하되, 옵셔널 요소는 제거하고, 새로운 배열을 리턴
  • map + 옵셔널제거
  • 옵셔널은 빼고, 컴팩트(compact)하게
  • 옵셔널 바인딩의 기능까지 내장
let stringArray: [String?] = ["A", nil, "B", nil, "C"]
var newStringArray = stringArray.compactMap { $0 }

print(newStringArray) //["A", "B", "C"] 

6. flatMap함수

var nestedArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print(nestedArray.flatMap { $0 }) //[1, 2, 3, 4, 5, 6, 7, 8, 9]

3차원배열.flatMap => 2차원배열
2차원배열.flatMap => 1차원배열
profile
AppleDeveloperAcademy@POSTECH 1기 수료, SOPT 32기 iOS파트 수료

0개의 댓글