[Swift 야곰] 3단원. 고차함수

Jamong·2023년 1월 20일
0

Day 14 - 2023.01.20

고차 함수

  • 고차 함수(Higher-order function)는 '다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수'를 뜻합니다.
  • 스위프트의 함수(클로저)는 일급시민(일급객체)이기 때문에 함수의 전달인자로 전달할 수 있으며, 함수의 결과값으로 반환할 수 있다.
  • map, filter, reduce 함수는 스위프트 표준 라이브러리의 컨테이너 타입(Array, Set, Dictionary 등)에 구현되어 있다.

map

  • map함수는 컨테이너 내부의 기존 데이터를 변형(transform)하여 새로운 컨테이너를 생성하다.
// 변형하고자 하는 numbers와 변형 결과를 받을 doubledNumbers, strings

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

기존의 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"]

map 메서드 사용

// numbers의 각 요소를 2배하여 새로운 배열 반환
doubledNumbers = numbers.map({ (numbers: Int) -> Int in
	return numbers * 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(doubeldNumbers)		// 출력: [0, 2, 4, 6, 8]

filter

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

기존의 for 구문 사용

// 변수 사용에 주목
var filterd: [Int] = [Int]()

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

print(filterd)			// 출력: [0, 2, 4]

filter 메서드 사용

// numbers의 요소 중 짝수를 걸러내어 새로운 배열로 반환
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 함수는 컨테이너 내부의 콘텐츠를 하나로 통합한다.
// 통합하고자 하는 someNumbers
let someNumbers: [Int] = [2, 8, 15]

기존의 for 구문 사용

// 변수 사용에 주목
var result: Int = 0

// someNumbers의 모든 요소를 더한다.
for number in someNumbers {
	result += number
}

print(result)			// 출력: 25

메서드 사용

// 초깃값이 0이고 someNumbers 내부의 모든 값을 더한다.
let sum: Int = someNumbers.reduce(0, {first: Int, second: Int) -> Int in
	return first + second
})

print(sum)		// 출력: 25

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

print(subtract)	// 출력: -25

// 초기값이 3이고 someNumbers 내부의 모든 값을 더한다.
let sumeFromThree = someNumbers.reduce(3) { $0 + $1 }

print(sumFromThree)	// 출력: 28
profile
새해 목표 : 1일 1 깃, 블로그, 프로그래머스 2문제

0개의 댓글