대표적인 고차함수로는 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 |