공부/SWIFT

[SWIFT] 함수(함수는 일급객체이다.)

알로하리미 2021. 3. 10. 16:18
728x90

함수의 기본개념 알아보러 가기 : 

2021.03.10 - [공부/SWIFT] - [SWIFT] 함수

 

javascript와 마찬가지로 스위프트의 함수도 일급객체이다.(first-class object)

다른 데이터 타입과 마찬기지로
변수에 할당이 될 수 있고
함수의 인자(매개변수)로 전달이되며
return값으로 반환 할 수 있다.
함수타입으로 사용 할 수 있다.(함수타입을 작성할땐 전달인자 레이블 사용불가)
( 매개변수 타입 ) -> 반환타입
//함수타입으로의 사용
//두개의 Int를받아 Int를 반환하는 함수면 해당 함수타입을 사용가능
typealias CalculateTwoInt = ( Int, Int ) -> Int


//함수타입 작성시 전달인자 레이블을 작성할 수 없다.

//오류 
let someFunction: (lhs: Int, rhs: Int) -> Int 

//와일드카드( _ )는 전달인자 레이블 안써도 된다는 소리므로 
let someFunction: (_ lhs: Int, _ rhs: Int) -> Int  //ok

let someFunction: (Int, Int) -> Int //ok

 

함수의 형은 파라미터 형과(parameter types) 반환 형(return type)으로 구성 돼 있습니다. 아래 두 함수는 Int값 두 개를 입력받고 Int를 반환하는 함수입니다.

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}

func multiplyTwoInts(_ a: Int, _ b: Int) -> Int {
    return a * b
}

// 입력 받는 파라미터와 반환 값이 없는 함수
func printHelloWorld() {
    print("hello, world")
}

 

 

함수를 변수처럼 정의해서 사용할 수 있습니다.

// (Int,Int) -> Int 요게 함수형이란 표현
// 변수 mathFunction는 addTwoInts 함수의 인자 값과 반환 값이 같으므로
// 이 함수가 변수로 할당 될 수 있습니다.
// var mathFunction: (Int, Int) -> Int = addTwoInts

// 함수형 타입 사용
var mathFunction: CalculateTwoInt -> Int = addTwoInts


print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5"


// multiplyTwoInts 함수도 mathFunction과 함수 형이 같으므로 
// 할당해 사용할 수 있습니다.
mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 6"

 

 

파라미터에 함수 형을 사용할 수 있습니다.

func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int) {
    print("Result: \(mathFunction(a,b))")
}
printMathResult( addTowInts , 3, 5 )
// Prints "Result: 8"

 

 

함수를 반환하는 함수를 만들수도 있습니다.

//입력한 step에 하나를 더하거나 빼는 함수를 선언
func stepForward(_ input: Int) -> Int {
    return input + 1
}

func stepBackward(_ input: Int) -> Int {
    return input - 1
}

//backward함수가 true냐 false냐에 따라 위에서 선언한 적절한 함수를 반환하는 함수
func chooseStepFunction(backward: Bool) -> (Int) -> int {
    return backward ? stepBackward : stepForward
}

var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero는 이제 stepBackward() 함수를 가르키고 있습니다.

print("Counting to zero:")
// Counting to zero:
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// 3...
// 2...
// 1...
// zero!

 

 

중첩 함수(Nested Function) : 함수 중에는 다른 함수 안의 body에서 동작하는 함수

중첩함수는 함수 밖에서는 감춰져 있고 함수의 body내에서 접근 가능
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero는 이제 중첩 돼 있는 stepForward() 함수를 가르킵니다.
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!