본문 바로가기
Swift

알쓸스잡 - 7

by songmoro 2025. 2. 1.
728x90

가변 파라미터, Variadic Parameters

함수에선 가변 파라미터라는 0개 이상의 특정 타입의 값을 허용한다.

  • 함수가 호출될 때 여러 개의 입력 값을 전달할 수 있음
  • 파라미터 타입 이름 뒤에 세 개의 간격 문자(...)를 추가하여 작성
  • 여러 개의 가변 파라미터를 가질 수 있음
func sumOfArray(numbers: Int...) -> Int {
    numbers.reduce(0, +)
}

func sumOfTwoArray(numbers1: Int..., numbers2: Int...) -> Int {
    (numbers1 + numbers2).reduce(0, +)
}

print(sumOfArray(numbers: 1, 2, 3, 4, 5))
print(sumOfTwoArray(numbers1: 1, 2, 3, 4, 5, numbers2: 1, 2, 3, 4, 5))

// 15
// 30

 

함수 타입

모든 함수는 파라미터와 반환 타입으로 구성된 특정 타입을 지님

예를 들어, 아래 함수는 (Int, Int) -> Int 타입

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

 

함수 타입 사용

변수에 함수 타입을 할당할 수 있고, 함수 타입을 다른 타입처럼 사용할 수 있다.

  • 여기에 같은 타입을 갖는 함수를 할당하여 호출할 수 있음
var mathFunction: (Int, Int) -> Int = addTwoInts
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 5"

mathFunction = multiplyTwoInts
print("Result: \(mathFunction(2, 3))")
// Prints "Result: 6"
  • mathFunction은 (Int, Int) -> Int 타입을 갖는 변수

 

파라미터로 함수 타입 사용

함수 타입을 다른 함수의 파라미터로 사용할 수 있다.

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

 

반환 타입으로 함수 타입 사용

파라미터와 반대로 반환 타입 또한 함수 타입으로 사용할 수 있다.

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

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}
var currentValue = 3
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)

while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")

// 3...
// 2...
// 1...
// zero!

 

중첩 함수

위의 함수들은 모두 전역 함수이며, 함수 내의 함수인 중첩 함수를 선언할 수 있음

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 now refers to the nested stepForward() function
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")
// -4...
// -3...
// -2...
// -1...
// zero!

 

참고

https://bbiguduk.github.io/swift-book-korean/documentation/the-swift-programming-language-korean/functions

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/functions

 

728x90

'Swift' 카테고리의 다른 글

Swift Concurrency  (0) 2025.02.04
알쓸스잡 - 8  (0) 2025.02.02
알쓸스잡 - 6  (0) 2025.01.21
알쓸스잡 - 5  (0) 2025.01.17
알쓸스잡 - 4  (0) 2024.12.30