본문 바로가기

Mobile/Swift

[Swift - 문법] 함수

반응형

1. 기본 함수

스위프트에서는 매개변수의 타입이 다르면 같은 이름의 함수를 여러 개 만들 수 있습니다. 
또 매개변수의 개수가 달라도 같은 이름의 함수를 만들 수 있습니다.

func hello(name: String) -> String {
    return "Hello \(name)!"
}

let helloStark: String = hello(name: "Stark")
print(helloStark)
// "Hello Stark!"
func introduce(name: String) -> String {
    "제 이름은 " + name + "입니다."
}
let helloThor: String = introduce(name: "Thor")
print(helloThor)
// 제 이름은 Thor입니다.
func plus100(num1: Int) -> Int {
    num1 + 100
}

let num1: Int = plus100(num1: 20)
print(num1)
// 120

2. 전달인자 레이블

전달인자 레이블을 별도로 지정하면 함수 외부에서 매개변수의 역할을 좀 더 명확히 할 수 있습니다. 아래 예시로 살펴보겠습니다.

func heroName(realName name:String, heroName hero:String) -> String {
    return "\(hero)의 진짜 이름은 \(name)입니다."
}
print(heroName(realName: "Tony Stark", heroName: "Ironman"))
// Ironman의 진짜 이름은 Tony Stark입니다.

"""
realName 과 heroName 은 전달인자 레이블이고
hero 와 name 은 매개변수 이름입니다.
함수 내부에서는 매개변수로 사용하고, 전달인자 레이블은 함수를 호출할 때 사용합니다.
"""

전달인자 레이블이 필요없는 경우에는 와일드카드 식별자를 사용합니다.

func greeceRomeMythology(_ godName: String, _ times: Int) -> String {
    var result: String = ""
    for _ in 0...times {
        result += "The \(godName) is here!" + " "
    }
    return result
}

print(greeceRomeMythology("zeus", 3))
// The zeus is here! The zeus is here! The zeus is here! The zeus is here!

매개변수의 기본값을 지정하고 싶은 경우에는 "="를 사용합니다.

func greeceRomeMythology(godName: String, repeats: Int = 3) -> String {
    var result: String = ""
    for _ in 0...repeats {
        result += "The \(godName) is here!" + " "
    }
    return result
}
print(greeceRomeMythology(godName: "Athena"))
// The Athena is here! The Athena is here! The Athena is here! The Athena is here!

print(greeceRomeMythology(godName: "Athena", repeats: 1))
// The Athena is here! The Athena is here!

3. 가변 매개변수와 입출력 매개변수

매개변수로 몇 개의 값이 들어올지 모를 때 가변 매개변수를 사용할 수 있습니다. 가변 매개변수는 0개 이상의 값을 받을 수 있고, 가변 매개변수로 들어온 인자 값은 배열처럼 사용할 수 있습니다. 함수마다 가변 매개변수는 하나만 가질 수 있습니다.

func myHeroes(me: String, heroes names: String...) -> String {
    var result: String = "\(me)(이)가 좋아하는 히어로는 "
    var heroes: String = ""
    var endString: String = "입니다."
    
    for hero in names {
        heroes += hero + ","
    }
    return result + heroes + endString
}

print(myHeroes(me: "AXCE", heroes: "ironman", "hulk", "thor", "spiderman"))
// AXCE(이)가 좋아하는 히어로는 ironman,hulk,thor,spiderman,입니다.

4. 데이터 타입으로서의 함수

typealias CalculateTwoInts = (Int, Int) -> Int

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

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

var mathFunction: CalculateTwoInts = addTwoInts
// ⬆️ var mathFunction: (Int, Int) -> Int = addTwoInts 와 같은 표현
print(mathFunction(10, 20))
// 30

mathFunction = multiplyTwoInts
print(mathFunction(10, 20))
// 200

func printMathResult(_ mathFunction: CalculateTwoInts, _ a: Int, _ b: Int) {
    print("Result: \(mathFunction(a, b))")
}

printMathResult(mathFunction, 10, 40)
// Result: 400

특정 조건에 따라 적절한 함수를 반환해주는 함수를 만들 수 있습니다. 위의 코드와 이어서 작성된 코드입니다.

func chooseMathFunction(_ toAdd: Bool) -> CalculateTwoInts {
    return toAdd ? addTwoInts : multiplyTwoInts
}

printMathResult(chooseMathFunction(true), 10, 50)
// Result: 60
printMathResult(chooseMathFunction(false), 10, 70)
// Result: 700

아래는 함수를 중첩으로 사용한 중첩 함수입니다.

typealias MoveFunc = (Int) -> Int

func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc {
    func goRight(_ currentPosition: Int) -> Int {
        return currentPosition + 1
    }
    
    func goLeft(_ currentPosition: Int) -> Int {
        return currentPosition - 1
    }
    
    // True 일 경우 goLeft 라는 함수를 리턴해야 하기 때문에 MoveFunc 라는 함수 타입을 사용해야 한다.
    return shouldGoLeft ? goLeft : goRight
}

var position: Int = -4

let moveToZero: MoveFunc = functionForMove(position > 0)
while position != 0 {
    print("\(position)...")
    // moveToZero는 MoveFunc라는 함수 타입이기 때문에 Int를 받아 Int를 반환한다.
    position = moveToZero(position)
}
print("원점 도착!!")
"""
-4...
-3...
-2...
-1...
원점 도착!!
"""

[출처: 야곰 SWIFT 스위프트 프로그래밍 (swift 5)]

반응형