Swift Function


Swift Function


* 스스로 공부 및 정리를 위해 The Swift Language Guide을 요약 및 정리 한 내용입니다.

정의와 호출(Defining and Calling Function)

  • 함수를 선언할때 가장 앞에 func 키워드를 붙이고 (person: String)파라미터와 형 그리고 -> String 형태로 반환형을 정의합니다.
  • 간단히, func + func이름 +(변수명: 데이터형) -> 반환데이터형 입니다
  • return이 반환 되므로, 짧은 계산식은 바로 리턴으로 계산과 출력을 같이 해도됩니다.
func hi(person: String) -> String {
    let hi = "Hello" + " " + person + "!!!"
    return hi
}
print(hi(person: "Cat"))
print(hi(person: "Dog"))

다양한 타입의 함수

파라미터가 없는 함수(Functions Without Parameters)

  • 입력값이 없이, 원하는 결과값만을 return해옵니다.
func hello() -> String {
    return "Hello World"
}
print(hello())

복수의 파라미터를 사용하는 함수(Function with Multiple Parameters)

  • 여러개의 입력값을 받아서 계산하거나 하는 Func에서 유용합니다.
func Cat(person: String, CatorNot: Bool) -> String{
    if CatorNot {
        return person + " is cute"
    }
    else {
        return person + " isn't cat"
    }
}
print(Cat(person: "Cat", CatorNot: true))

반환값이 없는 함수(Function Without Return Value)

  • C#에서는 Void라 불리는 함수 입니다.
  • 엄밀히 말하면 반환값을 선언하지 않았지만 반환값이 있습니다. 반환값이 정의되지 않았을 뿐입니다.
  • return값은 없지만 print를 통해 앞에서 하듯이 원하는 변수를 출력했습니다.
  • 그러나, print로 함수를 불려오면, return값이 없으니 출력되는 값은 없습니다.
func hicat(person: String){
    let cast = "Hello " + person
    print(cast)
}
print(hicat(person: "CCC"))

복수의 값을 반환하는 함수(Fucntion with Multiple Return Values)

  • 튜플을 함수의 반환 값으로 사용할수 있습니다.
  • 말그대로 여러개의 return값이 나옵니다.
func Sum(num: Int, num2: Int) -> (sum: Int, overten: Bool){
    let Sum = num + num2
    var overten = false
    if Sum > 10{
        overten = true
    }
    else{
        overten = false
    }
    return (Sum, overten)
}
print (Sum(num:5, num2:3))

옵셔널 튜플 반환형 (Optional Tuple Return Type)

  • 위의 반환 값과 달리 반환값에 ?물음표가 붙습니다(옵셔널이 붙습니다)
  • 옵셔널로 반환되었으니, 값에 접근할려면 언래핑하거나 if let같은 옵셔널 체인을 사용하여야 합니다.
func Sum(num: Int, num2: Int) -> (sum: Int, overten: Bool)?{
    let Sum = num + num2
    var overten = false
    if Sum > 10{
        overten = true
    }
    else{
        overten = false
    }
    return (Sum, overten)
}
if let SumoptionalChain = Sum(num: 5, num2: 3){
    print("\(SumoptionalChain.sum) \(SumoptionalChain.overten)")
}

인자 라벨 지정( Specifying Argument Labels)

  • 라벨을 통해 해당 변수를 외부에서 쓸때는 좀더 편하게 작성할수 있게 해둔 요소입니다.
  • 처음에는 이해하기 힘들었으나, 이해하니 정말 좋은 기능인거 같습니다
func Check(name: String, age: Int, from hometown: Int) -> String {
    let home: String
    switch hometown{
    case 1:
        home = "Busan"
    case 2:
        home = "Seoul"
    default:
        home = "Check Again"
    }
    return "\(name) and \(age)years old and \(home)"
}
print(Check(name: "noranfox", age: 33, from: 1))

인자 생략(Omitting Argument Label)

  • 앞에서는 라벨에 또다른 이름을 넣어서 함수사용시 사용하는 이름과 내부이름을 다르게 해주었다면, 이번에는 아예 생략 하는 것입니다.
  • “_“를 이용해서 인자를 생략합니다. 물론 함수선언에서 생략하는것이 아니라, 함수를 다른곳에서 불려와서 사용할떄 생략하는 것입니다.
  • “_“를 선언한뒤 띄어쓰고 변수명을 적어주어야합니다. 붙여적으면 안됩니다.
    func Check(_ name: String, age: Int, from hometown: Int) -> String {
        let home: String
        switch hometown{
        case 1:
       home = "Busan"
        case 2:
       home = "Seoul"
        default:
       home = "Check Again"
        }
        return "\(name) and \(age)years old and \(home)"
    }
    print(Check("noranfox", age: 33, from: 1))
    

기본 파라미터 값 (Default Parameter Value)

  • 함수의 파라미터 값에 기본 값을 설정할수 있습니다. 함수를 호출해서 사용시, 변수값을 넣지않고 생략해도 기본값이 사용되게 됩니다.
  • 기본 값을 사용하지 않는 파라미터를 앞에 위치 시켜야 사용하기 쉽습니다.
func Check(_ name: String, from hometown: Int, age: Int = 20) -> String {
    let home: String
    switch hometown{
    case 1:
        home = "Busan"
    case 2:
        home = "Seoul"
    default:
        home = "Check Again"
    }
    return "\(name) and \(age)years old and \(home)"
}
print(Check("noranfox", from: 1))
print(Check("noranfox", from: 1, age: 33))

집합 파라미터 (Variadic Parameter)

  • 인자 값으로 특정 형(type)의 집합 값을 사용할수 있습니다.
func Total(_ nums: Int...) -> Int {
    var total = 0
    for num in nums {
        total += num
        
    }
    return total
}
print(Total(1,2,3,4,5))

인-아웃 파라미터 (In-Out Parameter)

  • 인자 값을 직접 변경하는 파라미터입니다. 변수로서 들어온 인자를 변경할수 있습니다.
  • 사용할 인자에 타입 앞에 input을 붙여주면 됩니다.
  • 인-아웃 파라미터는 기본값을 가질수 없고, 집합 파라미터는 input으로 선언될수 없습니다.
  • 인-아웃 파라미터는 return없이 함수 scope 밖에 영향을 줄수 있는 방법입니다.
var total = 0
func Total(total: inout Int, _ nums: Int...) {
    var sum = 0
    for num in nums {
        sum += num
    }
    total = sum
}
Total(total: &total, 1,2,3,4,5)
print(total)

함수 형(Function Type)

  • 함수의 형은 파라미터 형과 반환 형으로 구성 돼 있습니다
  • 반환값이 없는 함수로서 사용도 가능합니다.
func justsum(_ a: Int, _ b: Int) -> Int{
    return a + b
}
print(justsum(1, 3))

func justsumstring(_ a: String,_ b:String) {
    print(a + b)
}
justsumstring("Cat", " is Cute")

함수 형의 사용

  • 함수를 변수 처럼 정의해서 사용할수 있습니다
  • 인자의 조건이 동일하다면 아래처럼 선언해서 함수를 변수처럼 사용가능합니다.
  • 인자의 조건을 굳이 선언하지 않아도 Swift가 추론해서 자동으로 함수를 할당 할 수 있습니다.
var sumFuction: (Int,Int) -> Int = justsum
print("Result : \(sumFuction(5, 10))")

var sumstring = justsumstring
sumstring("Hi"," Success")

파라미터 형으로써의 함수 형(Function Type as Parameter Type)

  • 파라미터에 함수 형을 사용할수 있습니다
func doubleSum(_ justsum: (Int, Int)-> Int, _ a: Int, _ b: Int){
    print("Result is \(justsum(a,b))")
}
doubleSum(justsum, 3, 5)

반환 형으로써의 함수 형 (Function Type as Return Type)

  • 결국, 바로 위의 파라미터 형으로서 함수와 이 부분은 함수를 다른 함수의 리턴값이나 인자로서 사용가능하다는게 핵심입니다
func sum1(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func minus(_ a: Int, _ b: Int) -> Int {
    return a - b
}

func CheckSumOrMinus (check: Bool, a: Int, b: Int) -> Int {
    return check ? sum1(a,b) : minus(a,b)
}
print(CheckSumOrMinus(check: true, a: 5, b: 4))

중첩 함수(Nested Function)

  • 위의 함수들은 모두 전역적으로 동작하도록 선언했습니다.
  • 다른 함수 안의 body에서 동작하는 함수가 있는데 이 함수를 중복함수(Nested Function)이라 합니다.
  • 중첩함수는 함수 밖에서는 감춰져 있고 함수의 body내에서 접근 가능합니다.
  • 마치 C#에서 클래스는 클래스내에 클래스가 있고 이는 그 클래스에서만 접근 가능한 모습과 유사합니다.
  • 주어진 예시가 정말 좋은 예시인거같습니다.
func Last(type: Bool) -> (Int) -> Int {
    func plus(input: Int) -> Int { return input + 1 }
    func minus(input: Int) -> Int{ return input - 1 }
    return type ? minus : plus
}

var currentValue = 4
let moveNearZero =  Last(type: currentValue > 0)
while currentValue > 0 {
    print("\(currentValue)...")
    currentValue = moveNearZero(currentValue)
}
print("zero")