개발

Swift 고차 함수를 이용하여 코드를 줄일 수 있다?

소소ing 2022. 12. 5. 18:29
반응형

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문 대신 고차 함수를 사용해 보는 것도 좋을 듯 합니다. 

감사합니다. 

 

 

 

 

출처 : https://url.kr/lrn9d7

반응형