-
Notifications
You must be signed in to change notification settings - Fork 0
[week07] 고차함수
serena edited this page Jun 30, 2023
·
2 revisions
- 함수를 매개변수로 전달받는 함수
- 함수의 실행결과를 함수로 반환하는 함수
- 기본 형태
// (Int, Int) -> Int : Int 2개의 매개변수를 갖고 Int를 반환하는 함수의 "타입"
func abc(param: (Int, Int) -> Int) {
}
// (Int, Int) -> Int : Int 2개의 매개변수를 갖고 Int를 반환하는 함수를 반환
func bcd() -> (Int, Int) -> Int {
}
func eee(param: (Int, Int) -> Int) -> (Int, Int) -> Int {
}
- 활용 예시
class Calculator {
func add(lhs: Int, rhs: Int) -> Int {
return lhs + rhs
}
func substract(lhs: Int, rhs: Int) -> Int {
return lhs - rhs
}
func divide(lhs: Int, rhs: Int) -> Int {
return lhs / rhs
}
func multiply(lhs: Int, rhs: Int) -> Int {
return lhs * rhs
}
}
let calculator = Calculator()
calculator.add(lhs:1, rhs:2)
calculator.divide(lhs:3, rhs:4)
// 제곱 계산을 해야하는 경우?
class Calculator {
func operate(lhs: Int, rhs: Int, operator: (Int, Int) -> Int) -> Int {
return operator(lhs, rhs)
}
}
let calculator = Calculator()
calculator.operate(lhs: 1, rhs: 2) { lhs, rhs in
return lhs + rhs
}
// 이거랑 동일
func add(lhs: Int, rhs: Int) -> Int {
return lhs + rhs
}
let result: Int = calculator.operate(lhs: 1, rhs: 2, operator : add)
//클로저를 쓴 경우
let result: Int = calculator.operate(lhs: 1, rhs: 2, operator : { (lhs, rhs) in
return lhs + rhs
})
- 컨테이너 내부의 요소를 처리하는 고차함수
- 기존 컨테이너의 요소를 전달받은 함수를 사용하여 매개변수를 '변형'한 후 새로운 컨테이너로 변환
- 이로인해 타입변경이 될 수 있다
- 기존의 컨테이너의 요소 중 전달받은 함수의 결과값이 true인 경우만 포함하여 새로운 컨테이너로 반환
- 요소의 갯수는 달라질 수 있지만, 타입은 변경될 수 없다.
- 기존의 컨테이너의 요소를 하나로 통합하는 고차함수
- 요소들을 반복적 연산을 하기위해 사용
- 연산의 초기값을 줘야 한다
- 직접 고차함수를 만들어 보자
extension String {
func myMap(_ method: (String) -> String) -> [String] {
var result: [String] = []
for i in self {
var plus = method(String(i))
result.append(plus)
}
return result
}
}
var A = "123"
A.myMap({
$0 + "나"
})
extension String {
func myFilter(_ isIncluded: (Character) -> Bool) -> [String] {
var result: [String] = []
for i in self {
let isTrue = isIncluded(i)
if isTrue {
result.append(String(i))
}
}
return result
}
}
"2re3sd4sd5d6".myFilter {
$0.isNumber
}
extension String {
func myReduce(_ initResult: String, _ method: (String, String) -> String) -> String {
var result: String = initResult
for i in self {
result = method(result, String(i))
}
return result
}
}
"123".reduce("0", { $0 + "번" + String($1) })
"123".myReduce("0", { $0 + "번" + $1 })