iOS 앱개발 5주차
1급 객체란?
1) 변수에 저장할 수 있다.
2) 매개변수로 전달할 수 있다.
3) 리턴값으로 사용할 수 있다.
위 3가지 조건을 충족하는 객체를 1급 객체라고 한다
func inchesToFeet (inches: Float) -> Float {
return inches * 0.0833333
}
let toFeet = inchesToFeet
위와같이 함수를 상수에 할당할 수 있다 따라서 1번 조건을 충족한다
func Square(x : Int) -> Int{
return x * x
}
func callbackTestFunc(value : Int, callback : (Int) -> Int) -> Int{
return callback(value)
}
print(callbackTestFunc(value : 10, callback : Square))
이처럼 다른 함수에 매개변수로 콜백함수를 전달할 수 있기 때문에 2번 조건도 충족한다
func createHelloFunc () -> (String)-> Void{
func sayHello(name : String) -> Void{
print("Hello \(name)")
}
return sayHello
}
let hi = createHelloFunc()
hi("doyoon")
createHelloFunc는 argument로 name을 받아서 프린트하는 sayHello 함수를 리턴하기 때문에 3번 조건도 충족한다
따라서 스위프트의 함수는 1급 객체이다.
함수: 일급 객체 더 알아보기
func up(num: Int) -> Int {
return num + 1
}
func down(num: Int) -> Int {
return num - 1
}
//함수를 상수에 할당
let toUp = up
print(up(num:10))
//주의: 변수 or 상수에 할당한 상태에서는 argument label 없이 호출해야한다
print(toUp(10))
콜백함수란?
스위프트 뿐만 아니라 자바스크립트 등등 에서도 많이 나오는 개념이다
챗 지피티는 이렇게 정의했다
콜백 함수(callback function)는 다른 함수의 인자로 전달되어 특정 조건이나 이벤트가 발생했을 때 호출되는 함수입니다. 주로 비동기 처리나 이벤트 핸들링에서 많이 사용됩니다. 콜백 함수는 호출되는 시점이 호출하는 쪽의 코드 흐름과는 독립적이기 때문에, 비동기 작업이 완료되었을 때 결과를 처리하는 데 유용합니다.
사용방법?
func up(num: Int) -> Int {
return num + 1
}
func down(num: Int) -> Int {
return num - 1
}
let toUp = up
let toDown = down
//콜백함수를 파라미터 값으로 받을 때는 그 콜백함수의 타입을 지정해 줘야 한다
print(type(of : up))
출력결과 : (Int) -> Int
up함수의 타입이다
func up(num: Int) -> Int {
return num + 1
}
func down(num: Int) -> Int {
return num - 1
}
let toUp = up
let toDown = down
//콜백함수를 파라미터 값으로 받을 때는 그 콜백함수의 타입을 지정해 줘야 한다
func upDown(callback : (Int) -> Int , value : Int) -> Int{
let result = callback(value);
return result
}
print(upDown(callback : toUp, value : 20))
print(upDown(callback : toDown, value : 20))
출력결과:
21
19
이렇듯 함수 내부적으로 수행할 로직을 함수로 넣어 더 유연하게 프로그래밍이 가능하다.
func up(num: Int) -> Int {
return num + 1
}
func down(num: Int) -> Int {
return num - 1
}
let toUp = up
let toDown = down
//함수를 리턴하기때문에 함수의 타입을 리턴타입으로 지정
func decideFunc (x : Bool) -> (Int) -> Int{
if x {
return toUp
} else {
return toDown
}
}
let t = decideFunc(x : true)
let f = decideFunc(x : false)
print(t(10))
print(f(10))
매개변수 x의 boolean값에 따라 증가, 감소 함수를 리턴하는 함수 decideFunc이다
함수를 리턴하기 때문에 decideFunc의 리턴값 타입은 리턴하는 함수의 타입을 지정해준다.
클로저 기초
기존의 함수 정의 방법
func add(x : Int , y : Int) -> Int{
return x + y
}
print(add(x : 10, y : 20))
이런식으로 func 예약어를 사용해서 함수를 만들었다 하지만 swift에서는 익명 함수를 만들 수 있다
let add = {(x : Int, y : Int) -> Int in
return x+y
}
// x : 10, y : 20 과 같이 labels를 통해 argument를 전달 할 수 없다!
print(add(10, 20))
print(type(of : add))
출력결과 :
30
(Int, Int) -> Int
//함수를 상수에 대입
let multiply = {(val1: Int, val2: Int) -> Int in
return val1 * val2
}
//상수 multiply에는 함수가 대입되어있기 때문에 함수처럼 호출이 가능하다
let result = multiply(10, 20)
출저: 스마일한의 스위프트 기초