본문 바로가기
⌨️ Language/swift

[Swift] 고차함수

by hyebin (Helia) 2023. 2. 6.

고차함수

  • 고차함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수
  • swift의 함수(클로저)는 일급시민이기 때문에 함수의 전달인자로 전달할 수 있으며, 함수의 결괏값으로 반환할 수 있음

일급객체 (First Class Citizen)

  1. 객체가 런타임에도 생성 가능하다.
  2. 객체를 인자 값으로 전달할 수 있어야 한다.
  3. 객체를 반환 값으로 사용할 수 있어야 한다.
  4. 데이터 구조 안에 저장할 수 있어야 한다.

 

map

  • 기존의 컨테이너의 요소에 대해 정의한 클로저로 매핑한 결과를 새로운 컨테이너로 반환
//For문 사용
let numArray = [1,2, 3, 4, 5, 6, 7, 8, 9]
var multiplyArray = [Int]()

for num in numArray{
    multiplyArray.append(num*7)
}
print(multiplyArray) //[7, 14, 21, 28, 35, 42, 49, 56, 63]

//map 사용
let numArray = [1,2, 3, 4, 5, 6, 7, 8, 9]
var multiplyArray: [Int] = numArray.map {$0*7}

print(multiplyArray) //[7, 14, 21, 28, 35, 42, 49, 56, 63]

 

filter

  • 기존 컨테이너의 요소에 대해 조건에 만족하는 값에 대해서 새로운 컨테이너로 반환
//For문 사용
let numArray = [1,2, 3, 4, 5, 6, 7, 8, 9]
var evenNumArray = [Int]()

for num in numArray{
    if num%2 == 0{
        evenNumArray.append(num)
    }
}

print(evenNumArray) //[2, 4, 6, 8]

//filter 사용
let numArray = [1,2, 3, 4, 5, 6, 7, 8, 9]
var evenNumArray = numArray.filter {$0%2 == 0}

print(evenNumArray) //[2, 4, 6, 8]

 

reduce

  • 정의한 클로저를 사용하여 기존 컨테이너의 요소를 결합한 결과를 반환
  • 초기값이 필요
//For문 사용
let numArray = [1,2, 3, 4, 5, 6, 7, 8, 9]
var sum = 0

for num in numArray{
    sum += num
}

print(sum) //45

//reduce 1
let numArray = [1,2, 3, 4, 5, 6, 7, 8, 9]
var sum = numArray.reduce(0, +)

print(sum) //45


//reduce 2
let numArray = [1,2, 3, 4, 5, 6, 7, 8, 9]
var sum = numArray.reduce(0) {$0 + $1}

print(sum) //45

 

forEach

  • for-in과 동일하게 각각의 Element들을 호출
  • forEach에서는 break, continue 구문을 사용할 수 없고, return을 통해서 빠져나갈 수 있음
let array = [1,2,3,4,5]

//for-in문
for num in array {
    print(num)
}

//forEach문
array.forEach {
    print($0)
}

 

compactMap

  • 컨테이너의 각 요소를 조건을 지정하여 호출할 때, nil 이 아닌 배열을 반환
  • sequence의 모든 원소에 대한 변환 작업 결과 중 nil이 아닌 것만을 Array로 반환
//1차원 배열
let a = [1, 2, 3, nil, 4, 5]
let compactMapTest = a.compactMap { $0 }
print(compactMapTest) // [1, 2, 3, 4, 5]

//nil이 있는 2차원 배열
let a = [[1, 2, 3], [nil, 4, 5]]
let compactMapTest = a.compactMap { $0 }
print(compactMapTest)
//[[Optional(1), Optional(2), Optional(3)], [nil, Optional(4), Optional(5)]]


//nil이 없는 2차원 배열
let a = [[1, 2, 3], [4, 5]]
let compactMapTest = a.compactMap { $0 }
print(compactMapTest) //[[1, 2, 3], [4, 5]]

 

flatMap

  • 컨테이너의 각 요소를 사용하여 지정된 조건을 호출할 때, 순차적인 결과의 배열을 반환
  • equence의 모든 원소에 대한 변환 작업을 concatenate 하여 반환
  • 고차원 배열을 한 꺼풀 벗겨서 하나 아래의 차원으로 바꿔준다는 의미
//1차원 배열
let a = [1, 2, 3, nil, 4, 5]
let flatMapTest = a.flatMap { $0 }
print(flatMapTest) // [1, 2, 3, 4, 5]


//nil이 있는 2차원 배열
let a = [[1, 2, 3], [nil, 4, 5]]
let flatMapTest = a.flatMap { $0 }
print(flatMapTest)
//[Optional(1), Optional(2), Optional(3), nil, Optional(4), Optional(5)]

//nil이 없는 2차원 배열
let a = [[1, 2, 3], [4, 5]]
let flatMapTest = a.flatMap { $0 }
print(flatMapTest) //[1, 2, 3, 4, 5]

 

반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] 제네릭 (Generic)  (0) 2023.02.07
[Swift] 에러 처리  (0) 2023.02.07
[Swift] 클로저 (Closure)  (0) 2023.02.06
[Swift] 익스텐션 (Extensions)  (0) 2023.02.06
[Swift] 프로토콜 (Protocol)  (0) 2023.02.06

댓글