본문 바로가기
etc/Swift

고차함수

by IT learning 2021. 5. 28.
728x90

 

오늘은 고차함수에 대해 공부했다.

 

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

 

그냥 한마디로 하자면, 유용한 함수들 알려주는거다.

 

map

map 함수는 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성한다.

 

- for 구문 사용

let numbers: [Int] = [0,1,2,3,4]
var doubledNumbers: [Int]
var strings: [String]

//MARK: for 구문 사용
doubledNumbers = [Int]()
strings = [String]()

for number in numbers {
    doubledNumbers.append(number * 2)
    strings.append("\(number)")
}

print(doubledNumbers) // [0,2,4,6,8]
print(strings) // ["0", "1", "2", "3", "4"]

먼저 for구문을 사용했을 때 이다. append() 함수를 이용해 모든 수를 돌아가며 저장한다.

 

- map 메서드 사용

doubledNumbers =  numbers.map({ (number: Int) -> Int in // 클로저 사용
    return number * 2
})


// numbers 의 각 요소를 문자열로 변환하여 새로운 배열 반환
strings = numbers.map({(number: Int) -> String in
    return "\(number)"
})

print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]


// 매개변수, 반환 타입, 반환 키워드(return)생략, 후행 클로저
doubledNumbers = numbers.map { $0 * 2 }

print(doubledNumbers)

map 메서드를 사용하면 아까 for 구문으로 일일이 돌던것을 그냥 map 메서드 사용으로 끝낸다. 간단하다. 처음에는 클로저를 형식대로 다 썼지만, 마지막엔 그냥 생략하고 $0 키워드로 구현이 가능하다.

 

filter

filter 함수는 컨테이너 내부의 값을 걸러서 새로운 컨테이너로 추출한다.

 

- for 구문 사용

var filtered: [Int] = [Int]()

for number in numbers {
    if number % 2 == 0 {
        filtered.append(number)
    }
}

print(filtered) // [0,2,4]

for 구문을 사용했을때 짝수만 추가하는 코드를 이렇게 작성했었다.

 

- filter 메서드 사용

let evenNumbers: [Int] = numbers.filter {
    (number: Int) -> Bool in
    
    return number % 2 == 0
}

print(evenNumbers) // [0,2,4]

// 매개변수, 반환 타입, 반환 키워드(return) 생략, 후행 클로저
let oddNumbers: [Int] = numbers.filter { $0 % 2 != 0 }

print(oddNumbers) // [1,3]

이렇게 똑같이 클로저를 사용해 간단하게 구현이 가능하다.

 

reduce

reduce 함수는 컨테이너 내부의 콘텐츠를 하나로 통합한다.

 

- for 구문 사용

let someNumbers: [Int] = [2,8,15]

// MARK: for 구문 사용
// 변수 사용에 주목
var result: Int = 0

for number in someNumbers {
    result += number
}

print(result) // 25

for 구문을 사용했을 경우 모든 배열을 다 돌면서 더하기를 해준다.

 

- reduce 메서드 사용

let sum: Int = someNumbers.reduce(0, {
    (first: Int, second: Int) -> Int in
    
    return first + second
})

print(sum) // 25

// 초깃값이 0이고 someNumbers 내부의 모든 값을 뺀다.
var subtract: Int = someNumbers.reduce(0, {
    (first: Int, second: Int) -> Int in
    
    return first - second
})

print(subtract) // -25


// 초깃값이 3이고 someNumbers 내부의 모든 값을 더합니다
let sumFromThree = someNumbers.reduce(3) { $0 + $1 }

print(sumFromThree) // 28

초깃값을 정해주고 (0) 0부터 컨테이너 안에 있는 모든 수를 더해준다. 이것도 클로저를 이용한다. 이렇게 간단히 for구문을 사용하지 않아도 사용할수가 있다.

728x90

'etc > Swift' 카테고리의 다른 글

추가적으로 공부해야할 것들  (0) 2021.05.28
오류 처리  (0) 2021.05.28
익스텐션(Extension)  (0) 2021.05.28
프로토콜(Protocol)  (0) 2021.05.28
assert와 guard  (0) 2021.05.28

댓글

IT_learning's Commit