정의
- 전달 인자로 함수를 전달받거나 함수 실행의 결과로 함수를 반환하는 함수입니다.
- map, filter, reduce와 같은 함수가 있습니다.
map
- 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성하는 함수.
생성
- numbers라는 배열을 생성하겠습니다.
- numbers 배열의 요소들을 변경하기 위한 doubledNumbers, strings 변수를 생성하겠습니다.
let numbers: [Int] = [0, 1, 2, 3, 4]
var doubledNumbers: [Int]
var strings: [String]
사용
- map 메서드를 사용하는 방식은 다음과 같습니다.
- numbers에 map 메서드를 호출하고 map의 전달 인자 자리에 클로저를 사용했습니다.
- map은 각각의 요소를 어떤 타입으로 변형해서 어떤 타입으로 반환할 것인지를 지정할 수 있습니다.
// numbers의 각 요소를 2배 처리한 새로운 배열 반환
doubledNumbers = numbers.map({ (number: Int) -> Int in
return number*2
})
// numbers의 각 요소를 문자열로 변환하여 새로운 배열 반환
strings = numbers.map({ (number: Int) -> String in
return "\(number)"
})
print(doubledNumbers)
print(strings)
실행결과
// [0, 2, 4, 6, 8]
// ["0", "1", "2", "3", "4"]
- map메서드에서도 클로저에서 사용되는 매개변수, 반환 타입, 반환 키워드 생략과 후행 클로저 사용이 가능합니다.
doubledNumbers = numbers.map { $0*2 }
print(doubledNumbers)
실행결과
// [0, 2, 4, 6, 8]
filter
- 컨테이너 내부의 값을 걸러서(조건에 부합하는 요소만) 새로운 컨테이너로 추출하는 함수.
생성
- 요소를 갖고 있는 numbers 배열을 생성하겠습니다.
- numbers의 요소를 추출받을 filtered라는 이름의 배열을 생성하겠습니다.
let numbers: [Int] = [0, 1, 2, 3, 4]
var filtered: [Int] = [Int]()
사용
- 조건에 부합하는 요소를 작성할 evenNumbers라는 상수를 하나 생성하겠습니다.
- 변수를 사용해도, 상수를 사용해도 상관없으니 상황에 맞게 사용하시면 됩니다.
- numbers에 filter메서드를 호출하여, 클로저를 사용했습니다.
- 클로저 블록 내에서 조건식에 맞는 타입을 지정해 코드를 작성할 수 있습니다.
let evenNumbers: [Int] = numbers.filter {
(number: Int) -> Bool in
return number % 2 == 0
}
print(evenNumbers)
- filter메서드에서도 클로저에서 사용되는 매개변수, 반환 타입, 반환 키워드 생략과 후행 클로저 사용이 가능합니다.
let evenNumbers: [Int] = numbers.filter { $0 % 2 != 0 }
print(evenNumbers)
실행결과
// [1, 3]
reduce
- 컨테이너 내부의 콘텐츠를 하나로 통합하는 함수.
- for 구문을 사용하지 않아도 모든 요소를 더할 수 있습니다.
생성
- someNumbers라는 정수형 배열을 생성하겠습니다.
let someNumbers: [Int] = [2, 8, 15]
사용 : 값 더하기
- 초기값이 0이고, someNumbers 내부의 모든 값을 더하는 코드입니다.
- sum 상수를 만들고, someNumbers에 reduce를 호출해 클로저를 사용하였습니다.
let someNumbers: [Int] = [2, 8, 15]
let sum: Int = someNumbers.reduce(0, {(first: Int, second: Int) -> Int in
return first + second
})
print(sum)
실행결과
// 25
사용 : 값 빼기
- 초기값이 0이고, someNumbers 내부의 모든 값을 빼는 코드입니다.
- 값 더하기 예제와 동일한 방법으로 코드를 작성했습니다.
let someNumbers: [Int] = [2, 8, 15]
let sum: Int = someNumbers.reduce(0, {(first: Int, second: Int) -> Int in
return first - second
})
print(sum)
실행결과
// -25
사용 : 초기값 지정
- 초기값이 3이고, someNumbers 내부의 모든 값을 더하는 코드입니다.
- reduce메서드에서도 클로저에서 사용되는 매개변수, 반환타입, 반환키워드 생략과 후행 클로저 사용이 가능합니다.
let someNumbers: [Int] = [2, 8, 15]
let sumFromThree = someNumbers.reduce(3) { $0 + $1 }
print(sumFromThree)
실행결과
// 28
내용 출처
https://www.youtube.com/watch?v=HmabXrK2tRo&list=PLz8NH7YHUj_ZmlgcSETF51Z9GSSU6Uioy&index=29
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
mutating (0) | 2022.02.09 |
---|---|
제네릭 [ Generic ] (0) | 2022.02.08 |
오류 처리 [ error handling ] (0) | 2022.02.04 |
열거형 [ enum ] (0) | 2022.02.03 |
클래스 [ Class ] (0) | 2022.02.03 |
댓글