swift

Swift 고차함수 Map, Filter, Reduce

ag2개발자 2022. 2. 5. 19:02

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

고차함수는 "다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수"이다.


MAP


map은 데이터를 변형하고자 할 때 사용합니다.

기존 데이터를 변형하여 새로운 컨테이너를 만드는데, 기존 데이터는 변형되지 않습니다.

특히 map은 기존의 for-in 구문과 큰 차이가 없지만, map 사용시 다음과 같은 이점이 있습니다.

 

1. 코드의 간결성 

2. 재사용 용이 

3. 컴파일러 최적화 성능 좋음

 

map의 형태:

array.map(Transform: T, throws -> T)

for - in 구문과 비교해 보겠다.

for - in:

let array = [1, 2, 3, 4, 5]
var xarray = [int]()
for n in array{
	xarray.append(n*2)
}
print(xarray)
// [2, 4, 6, 8, 10]

map:

let array = [1, 2, 3, 4, 5]
let xarray = array.map{$0 * 2}
print(xarray)
//[2, 4, 6, 8, 10]
let array = [1, 2, 3, 4, 5]
let xarray = array.map{(num: Int) -> Int in
	return num*2
})
print(xarray)
// [2, 4, 6, 8, 10]

map코드는 위 코드에서 매개변수, 반환 타입, 반환 키워드(return)를 생략(축약)한 후행 클로저 입니다.

클로저에 관한 이야기는 또 따로 다루도록 하겠습니다.

 

 

Filter


 

filter는 원하는 데이터를 추출하고자 할 때 사용합니다.

기존 컨테이너에서 내부의 값을 걸러 새로운 컨테이너를 만듭니다.

filter 또한 map과 마찮가지로 for-in문과 비슷합니다.

 

filter의 기본 형태는

array.filter(isincluded: T throws -> T)

이다. 본격적으로 for - in 문과 비교해보자

 

for - in:

let array = ["자동차", "티비", "컵", "노트북", "커피"]
var cntarray = [String]()
for a in array{
	if a.count == 2{
    	cntarray.append(a)
    }
}
print(cntarray)
// ["티비", "커피"]

filter:

let array = ["자동차", "티비", "컵", "노트북", "커피"]
let cntarray = array.filter{$0.count == 2}
print(cntarray)
// ["티비", "커피"]

많이 간결해 진걸 볼 수 있다.

 

후행 클로져가 되기 이전 코드는

let array = ["자동차", "티비", "컵", "노트북", "커피"]
let cntarray = array.filter({(a : String) -> Bool in
	return a.count ==2
})
print(cntarray)
// ["티비", "커피"]

이다.

 

 

Reduce


reduce는 데이터를 합쳐주기 위해 사용합니다. 괄호안은 초기값입니다. 바로 for - in 문과 비교해 보겠습니다.

 

for - in:

let array = [1, 2, 3, 4, 5]
var hap = 0
for a in array{
	sum += a
}
print(sum)
//15

reduce:

let array = [1, 2, 3, 4, 5]
let hap = array.reduce(0){$0 + $1}
print(sum)
//15

훨씬 간결한 것을 알 수 있습니다.

마찮가지로 후행 클로져가 되기 이전 코드는

let array = [1, 2, 3, 4, 5]
let hap = array.reduce(0, {(first : Int, second : Int) -> Int in 
	return first + second
})

print(sum)
//15

입니다.

 

모두 화이팅!

'swift' 카테고리의 다른 글

스위프트의 배열과 문자열 꿀팁들  (0) 2022.02.07
스위프트 배열에 원소 삽입, 제거, 찾기, 포함  (0) 2022.02.07
스위프트 for문  (0) 2022.02.03
스위프트 배열과 enumerated()  (0) 2022.02.03
swift String.Index  (0) 2022.02.03