iOS 개발 기록

Swift - 고차함수 (map, filter, reduce) 본문

Swift

Swift - 고차함수 (map, filter, reduce)

택꽁이 2022. 7. 18. 15:22
728x90

 

전에 쓴 글인 Swift의 특징과 프로그래밍 패러다임에서 함수형 프로그래밍의 대표적인 예가 고차함수다. 

 

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

여기서 함수는 클로저 또한 포함된다. 

Swift에서 제공하는 대표적인 고차함수의 예는 map, filter, reduce가 있다 .

 

 

map 

기존에 컨테이너의 데이터를 변형해 새로운 컨테이너로 반환한다.   

다음 예는 0부터 5까지의 수가 홀수인지 체크하여 Bool형태로 변형하는 방법이다.

let numbers: [Int] = [0, 1, 2, 3, 4, 5]
var checkOdd: [Bool] = []

// for문
for num in numbers { 
    if num%2 == 1  {
        checkOdd.append(true)
    } else { 
        checkOdd.append(false)
    }
    
}
print(checkOdd)

// map
checkOdd = numbers.map{ $0%2 == 1 }
print(checkOdd)

출력 결과

 

 

compactMap, flatMap 

compactMap : 각 컨테이너의 요소를 새로운 컨테이너로 반환할 때에 nil 값은 제외한다. 

let strNumbers: [String] = ["0", "일", "2", "3", "4", "5"]

let map = strNumbers.map { Int($0) } 
print(map)

let compact = strNumbers.compactMap{ Int($0) }
print(compact)

map과 compactMap의 출력 결과

 

 

 

flatMap : 컨테이너의 데이터의 요소를 변환하면서 동시에 연결된 결과를 포함한 배열을 반환한다. 

말이 어렵다 ...  간단하게 쓰면 2차원, 3차원과 같이 중첩된 배열을 플랫한 배열로 리턴한다. 

3차원은 2차원으로, 2차원은 1차원 배열로 리턴한다. 

let numbers: [[Int]] = [[0], [1], [2, 3], [4, 5, 6]]

let flat = numbers.flatMap { $0 } 
print(flat)

flatMap 출력 결과

 

 

 

 

 

 

 

 

filter

기존의 컨테이너의 데이터를 조건에 만족하는 값에 해당하는 새로운 컨테이너로 추출한다.

다음 예는 홀수값만 추출하는 방법이다.

let numbers: [Int] = [0, 1, 2, 3, 4, 5]
var checkOdd: [Int] = []

// for문
for num in numbers { 
    if num%2 == 1  {
        checkOdd.append(num)
    } 
}
print(checkOdd)

// filter
checkOdd = numbers.filter{ $0%2 == 1 }
print(checkOdd)

출력 결과

 

 

 

reduce

컨테이너의 요소를 결합한 결과를 반환한다. 

매개변수로는 초기값과 컨테이너의 요소를 결합하는 방법을 넘겨준다.

다음 예는 배열의 모든 값을 더한 값을 출력하는 방법이다.

let numbers: [Int] = [0, 1, 2, 3, 4, 5]
var sum: Int = 0 
// for문
for num in numbers { 
    sum += num
}
print(sum)
// reduce
sum = numbers.reduce(0, +)
print(sum)

reduce 출력 결과