본문 바로가기
🍎iOS프로그래밍/겨울방학 특강

Swift문법 - 고차함수

by 둥둥동동# 2022. 1. 13.
728x90

순서

고차함수

map

filter

reduce

 

고차함수(higher-order function)

 

고차함수란 다른함수를 매개변수로 받거나 실행결과를 함수로 반환하는 함수

즉, 1급객체인 Swift의 함수는 고차함수를 구현할 수 있습니다

대표적인 고차함수로 map, filter, reduce 가 있습니다 

 

 

map

 

Array의 map메서드를 예시로 들어보겠습니다

func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
cs

형태를 보니 함수를 매개변수로 받고 다시 다시 리턴하는 것 같습니다

 

컨테이너(배열)가 가진 값을 매개변수(클로저)에 전달하여 새로운 컨테이너를 생성해 반환합니다

arr 배열의 각 요소*10된 값을  myInt배열에 넣는 코드입니다

배열을 먼저 선언하고 for문 변수를 정하는 등 번거러운 사전작업이 필요합니다

var arr = [1,2,3,4]
var myInt = [Int]()
var myString = [String]()
 
for index in arr.indices {
    myInt.append(arr[index] * 10)
   myString.append("\(arr[index])")
}
print(myInt) // [10,20,30,40]
print(myString) // ["1","2","3","4"]
cs

 

map() 메서드를 이용하면 좀 더 깔끔한 코드로 작성할 수 있습니다

arr의 요소를 Int형 number로 받아 number* 10 (Int)값을 리턴합니다 

이 때 arr값은 전혀 영향을 받지 않습니다

var arr = [1,2,3,4]

var myInt = arr.map( { (number:Int-> Int in
    return number * 10
})
var myString = arr.map({ (number:Int-> String in
    return "\(number)"
})
print(myInt) // [10,20,30,40]
print(myString)// ["1","2","3","4"]

cs

 

매개변수, 리턴형, return키워드를 생략하고

후행클로저를 이용하면 더 간단하게 바꿀 수 있습니다

var arr = [1,2,3,4]
var myInt = [Int]()
var myString = [String]()
 
myInt = arr.map{ $0 * 10}
myString = arr.map{ "\($0)"}
print(myInt)  // [10,20,30,40]
print(myString)// ["1","2","3","4"]
print(myInt) // Array<Int>
print(myString)//Array<String>

cs

 

 

•CompactMap

map과 동일하지만 nil을 반환하지 않고 언래핑한 값을 반환합니다

var arr = [1,nil,3,4]
var map = arr.map{ $0 }
var cMap = arr.compactMap{ $0 }
print(map)  //[Optional(0),nil,Optional(3),Optional(4)]
print(cMap) //[1,3,4]
cs

 

 

 

filter

 

조건식에 부합하는 값만 추출해 반환합니다

이번에는 축약식만 사용해 표현해 보겠습니다

var arr = ["손","어깨","허리","팔꿈치"]
 
var filter = arr.filter{ $0.count == 2 }
print(filter) //["어깨", "허리"]
cs

아래 조건식에 부합하는 요소만 반환되었습니다

 

 

 

reduce

 

컨테이너 내부의 값을 하나로 통합해 리턴합니다

var arr = ["손","1","A","52,1","팔꿈치"]
 
var result1 = arr.joined()
print(result1)//손1A52.1팔꿈치
 
var result2 = arr.reduce("결과=", {$0 + $1})
print(result2)//결과=손1A52.1팔꿈치
 
var result3 = arr.reduce("결과->") {$0 + $1}
print(result3)//결과->손1A52.1팔꿈치
cs

 

 

 

참고자료

한성현 교수님의 유튜브 강의

https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

728x90

댓글