Swift 함수

미니·2022년 4월 30일
0

Swift 문법

목록 보기
6/6
post-thumbnail

함수는 작업의 가장 작은 단위이자 하나의 작은 프로그램이다. 스위프트에서 함수는 일급 객체이기 때문에 하나의 값으로도 사용할 수 있다. 스위프트 내에서 함수의 모습이 다양하고, 코딩 스타일도 여러가지 이다. 그렇기 때문에 협업을 할때, 코딩 규칙을 정해서 사용을 하기도 한다. 가장 간단한 방법은 SwiftLint를 활용하는 것이다.

함수와 메서드는 기본적으로 동일하다. 다만, 상황이나 위치에 따라서 다른 용어로 부르는 것이다. 함수는 정의하는 위치와 호출되는 범위만 다를 뿐, 정의하는 키워드와 구현하는 방법은 동일하다. 소괄호를 생략할 수 없으며, 재정의와 중복 정의를 모두 지원한다. 따라서 매개변수의 타입이 다르면 같은 이름의 함수를 여러개 생성 할 수 있다. 또한, 매개변수의 개수가 달라도 같은 이름의 함수를 생성할 수 있게 된다.

함수를 정의하는 키워드는 func이다. 반환타입을 명시하기 위해서는 ->를 사용하여서 명시해준다. 반환타입이 정의되어 있는 경우에는 return 을 통해서 같은 타입의 값을 반환 해줘야 한다.

func hello(name:String)->String{
    return "Hello \(name)"
}
let helloWorld:String = hello(name: "Min")
print(helloWorld) //Hello Min

func introduce(name:String)->String{
    "제이름은" + name + "입니다."
}
let introduceKey:String = introduce(name: "민")
print(introduceKey) //제이름은민입니다.

스위프트의 함수는 매개변수를 어떻게 정의 하냐에 따라서 모습이 달라진다. 만약, 매개변수가 필요하지 않다면, 소괄호 내부를 비우면 된다. 매개변수가 여러개 필요한 함수를 정의할 때에는 쉼표를 통해서 매개변수를 구분하여야 한다. 매개변수에는 항상 타입을 명시해야하는 것을 주의해야한다.

func helloWorld2()->String{
    return "hello world!"
}
print(helloWorld2()) //hello world!

매개변수의 레이블은 매개변수의 이름으로 자동으로 지정된다. 하지만, 함수의 역활을 명확히 구분하기 위해서 매개변수의 역활로 정의 하는 경우가 있다. 그럴 때에는 매개변수 앞에 한칸 띄운 뒤 전달 인자 레이블을 정의하면 된다.
매개변수 이름을 지정하고 싶지 않다면, 와일드 카드 식별자를 사용하여서 매개변수를 숨길 수 있다. 전달 인자 레이블을 변경하면 함수의 이름 자체가 변경된다. 그렇기 때문에 전달인자 레이블만 다르게 작성하여도 중복 정의 할 수 있다.

func sayHello(myName:String,yourName:String)->String{
    return "Hello \(yourName), I'm \(myName)"
}
print(sayHello(myName: "미니", yourName: "제니"))

func sayHello(from myName:String,to yourName:String)->String{
    return "Hello \(yourName), I'm \(myName)"
}
print(sayHello(from: "미니", to: "제니"))

// print ::: Hello 제니, I'm 미니

매개변수 마다 기본값을 설정할 수도 있다. 즉, 매개변수가 전달되지 않으면 기본값을 사용하여 함수를 실행하게 된다. 매개변수로 몇개의 값이 들어올지 모를 경우에는 가변 매개변수를 활용하여서 배열이 전달된것처럼 활용할 수 있다.

func sayHello(_ name:String, _ times:Int)->String{
    var result:String = ""

    for _ in 0..<times{
        result += "Hello \(name)! "
    }

    return result
}

func sayHello(_ name:String, repeatCount times:Int)->String{
    var result:String = ""
    
    for _ in 0..<times{
        result += "Hello \(name)! "
    }
    
    return result
}

print(sayHello("Jenny", 3))
print(sayHello("jenny", repeatCount: 5))

func sayHelloToFriend(me:String,friends names:String...)->String{
    var result:String = ""
    
    for friend in names{
        result += "Hello \(friend)!" + " "
    }
    
    result += "I'm " + me + "!"
    return result
}
print(sayHelloToFriend(me: "min", friends: "jenny","jisoo","rose","lisa"))



/*
- print
Hello Jenny! Hello Jenny! Hello Jenny! 
Hello jenny! Hello jenny! Hello jenny! Hello jenny! Hello jenny!
Hello jenny! Hello jisoo! Hello rose! Hello lisa! I'm min!
*/

함수는 특정 연산을 실행 후, 결과값을 반환하게 된다. 하지만, 반환이 굳이 필요하지 않은 경우가 있다. 그럴 때에는 반환이 없는 함수를 생성해줄 수 있다. Void라는 키워드를 사용한다. 또한, 반환타입을 명시하지 않을 수도 있다.


func nonReturn(){
    print("hello World")
}
nonReturn()

//print ::: hello World

스위프트에서는 함수가 일급 객체이기 때문에 하나의 데이터 타입으로 활용할 수도 있다. 즉, 각 함수는 매개변수 타입과 반환타입으로 구성되어 있는 하나의 타입으로 사용이 가능하다.

func nonReturn(){
    print("hello World")
}
nonReturn()

typealias CalculateTwoInts = (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:CalculateTwoInts = addTwoInts
print(mathFunction(2, 5))
mathFunction = multiplyTwoInts
print(mathFunction(2,5))

//print ::: 7 10

스위프트는 데이터 타입의 중첩이 자유롭다. 함수의 중첩을 사용하면, 함수내에 함수를 정의할 수 있다. 함수 안의 함수로 구현된 중첩함수는 상위 함수의 몸통 블록 내부에서만 활용이 가능하다.

참고 : 스위프트 프로그래밍 (저자 - 야곰)

profile
IOS 개발자 지망생

0개의 댓글