❗️함수는 일급 객체이다.
👉 다음 조건을 만족하는 객체를 일급 객체라고 한다.
1.무명의 리터럴로 생성할 수 있다. (런타임 생성이 가능하다.)
2.변수나 자료구조(배열의 요소나 객체의 속성값)에 할당 할 수 있다.
3.다른 함수의 인자로 전달될 수 있다.
4. 다른 함수의 결과로서 리턴될 수 있다.
고차함수란?
고차함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수 를 뜻합니다.
스위프트의 함수(클로저)는 일급시민이기 때문에 함수의 전달인자로 전달할 수 있으며, 함수의 결과값으로 반환할 수 있습니다.
고차함수 종류
map
filter
reduce
forEach
compactMap
FlatMap
map
Returns an array containing the results of mapping the given closure over the sequence’s elements.
기존의 컨테이너의 요소에 대해 정의한 클로저로 매핑한 결과를 새로운 컨테이너로 반환합니다.
let string = ["1", "2", "3", "4", "5"]
var numbers: [Int] = []
for index in string {
if let changeToInt = Int(index) {
numbers.append(changeToInt)
}
}
print(numbers)
// [1, 2, 3, 4, 5]
let string = ["1", "2", "3", "4", "5"]
let numbers = string.map { Int($0)! }
print(numbers)
// [1, 2, 3, 4, 5]
Returns an array containing, in order, the elements of the sequence that satisfy the given predicate.
기존 컨테이너의 요소에 대해 조건에 만족하는 값에 대해서 새로운 컨테이너로 반환합니다.
// numbers에서 짝수만 추출하기
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)
}
}
print(evenNumbers)
// [2, 4, 6, 8]
// numbers에서 짝수만 추출하기
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)
// [2, 4, 6, 8]
Returns the result of combining the elements of the sequence using the given closure.
reduce 는 정의한 클로저를 사용하여 기존 컨테이너의 요소를 결합한 결과를 반환합니다.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const sum1 = numbers.reduce((accumulator, currentNumber) => accumulator + currentNumber);
console.log('sum1 =', sum1);
// callback함수 선언 후 이용
function sumReducer(accumulator, currentNumber) {
return accumulator + currentNumber;
}
const sum2 = numbers.reduce(sumReducer);
console.log('sum2 =', sum2);
// 실제직업과 다릅니다.
const friends = [
{
name: '양주진',
age: 32,
job: '코인러',
married: false,
},
{
name: '오영제',
age: 32,
job: '랩퍼',
married: false,
},
{
name: '서준형',
age: 32,
job: '2년차 유부남',
married: true,
}
];
// 3명의 나이를 더해봅니다.
// 여기서 초기값 설정이 반드시 필요합니다.
const ageSum = friends.reduce((accumulator, currentObject) => {
return accumulator + currentObject.age;
}, 0);
console.log('친구들 나이 합 ', ageSum);
배열의 요소가 하나 뿐이면서 initialValue가 없는 경우, 또는 initialValue는 주어졌으나 배열이 비어 있는 경우엔 계산할 필요가 없기 때문에 그 값을 callback 호출 없이 그대로 반환합니다.
위 작동방식을 근거로
예제2번의 경우 initialValue가 없을 경우 첫 번째 콜백에서 TypeError가 발생하게됩니
const friends = [
{
name: '양주진',
age: 32,
job: '코인러',
married: false,
},
{
name: '오영제',
age: 32,
job: '랩퍼',
married: false,
},
{
name: '서준형',
age: 32,
job: '2년차 유부남',
married: true,
}
];
// initialValue 설정X
const ageSum = friends.reduce((accumulator, currentObject) => {
return accumulator + currentObject.age;
});