Swift를 사용할때 고차 함수에 대해서 알고 있습니까?
고차함수에는 map, filter, reduce, forEach, compaceMap, FlatMap 등이 있지만
map, filter, reduce 이 3가지 함수에 대해 오늘 알아보고자 합니다.
그럼 고차함수가 무엇일까요?
고차함수란 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수라고 합니다.
내용이 조금 어렵네요;;;
1. map
func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
- 매개변수 transform : 매핑 클로저로, 이 컨테이너의 요소를 매개변수로 받아들이고 정의한 클로저의 형태에 맞게 변환된 값을 반환합니다.
- 리턴 : 이 컨테이너의 변환된 요소를 포함하는 배열을 반환합니다.
- 예시1 : String 배열을 Int 배열로 변환을 한다고 가정한다면?
// for문으로 변환 시
let string = ["1", "2", "3", "4", "5"]
var numbers: [Int] = []
for index in string {
if let changeToInt = Int(index) {
numbers.append(changeToInt)
}
}
// map 사용 시
let string = ["1", "2", "3", "4", "5"]
let numbers = string.map { Int($0)! }
- 예시2 : Int 배열에서 특정 연산 후 새로운 배열을 얻는다고 한다면?
// for문으로 모든 배열값에 9를 곱한다면
let Numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var multiplyArray: [Int] = []
for number in Numbers {
multiplyArray.append(number * 9)
}
// map을 통해 배열값에 9를 곱한다면
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let multiplyArray: [Int] = numbers.map { $0 * 9 }
2. filter
func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
- 매개변수 isIncluded : 컨테이너의 요소를 인수로 취하고, 요소가 반환된 배열에 포함되어야 하는지 여부를 Bool 값으로 반환하는 클로저입니다.
- 리턴 : true 로 반환되는 값만 리턴합니다.
- 예시1 : Int 배열에서 짝수만 추출한다면?
// for문으로 짝수 추출하기
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var evenNumbers: [Int] = []
for number in numbers {
if number % 2 == 0 {
evenNumbers.append(number)
}
}
// filter로 짝수 추출하기
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
- 예시2 : String 배열에서 글자 수가 2개인 항목만 추출한다면?
// for문으로 문자길이 2개 이상 추출
let sports = ["테스트", "가가", "나다리", "다다", "미미", "아무개"]
var twoLetterSports: [String] = []
for sport in sports {
if sport.count == 2 {
twoLetterSports.append(sport)
}
}
// filter를 이용하여 문자길이 2개 이상 추출
let sports = ["테스트", "가가", "나다리", "다다", "미미", "아무개"]
let twoLetterSports: [String] = sports.filter { $0.count == 2 }
3. reduce
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
- 매개변수 initialResult : 초기값으로 사용할 값을 넣으면 클로저가 처음 실행될 때, nextPartialResult 에 전달됩니다.
- 매개변수 nextPartialResult : 컨테이너의 요소를 새로운 누적값으로 결합하는 클로저입니다.
- 리턴 : 최종 누적 값이 반환되며, 컨테이너의 요소가 없다면 initialResult 의 값이 반환됩니다.
- 예시1 : Int 배열 합을 구한다면?
// for문으로 배열 총 합 구하면
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var sum = 0
for number in numbers {
sum += number
}
// reduce를 사용해서 총 합을 구하면
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let sum = numbers.reduce(0, +)
// 또는
let sum = numbers.reduce(0) { $0 + $1 }
- 예시2 : Int 배열 곱을 구한다면?
// for문으로 배열 곱을 구하면
let numbers = [1, 2, 3, 4, 5]
var sum = 1
for number in numbers {
sum *= number
}
// reduce로 배열 곱을 구하면
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(1, *)
// 또는
let sum = numbers.reduce(1) { $0 * $1 }
길어지는 코드를 줄이고 싶다면 for문 대신 고차 함수를 사용해 보는 것도 좋을 듯 합니다.
감사합니다.
'개발' 카테고리의 다른 글
async/await API 최적화 (0) | 2023.01.17 |
---|---|
CocoaPods 라이브러리 등록 후 업데이트 시 Authentication token is invalid or unverified. 오류가 뜬다면? (0) | 2022.12.20 |
앱 및 앱 내 구입에 대한 향후 가격 및 세금 변동에 따른 대응 방법! (0) | 2022.09.22 |
swift 단말기 설정에서 알림 ON/OFF 시 앱에서 이벤트 받기! (0) | 2022.09.22 |
22년 6월 30일 이후 앱 심사 시 Sign in with Apple 적용 대상 앱에 회원탈퇴 시 revoke api 적용 지침 가이드 (0) | 2022.06.28 |