이 글은 Swift 문법 정리글입니다.
Swift의 함수에 대해서 알아보도록 하겠습니다. 함수는 기본적으로 함수의 매개변수와 매개변수의 타입으로 표현할 수 있습니다.
func someFunc(a : Int, b : Int) -> Int {
return a + b
}
그리고 함수에 반환 타입은 ->을 이용해서 표현할 수 있습니다. 반환타입이 없다면 어떻게 표현할 수 있을까요?
func someFunc() -> Void {
print("Hello"!)
}
// 동일한 표현
func someFunc() {
print("Hello!")
}
Void라는 키워드를 이용할 수 있습니다. Void는 반환타입이 존재하지 않다는 의미에 typealiase입니다. 그리고 Void 타입의 함수에서는 return 키워드를 통해 함수를 종료시킬 수 있습니다. 하지만 명시하지 않더라도 함수는 종료됩니다. 그리고 Void는 생략이 가능합니다.
다만, 매개변수가 존재하지 않다면 ()는 생략할 수 없습니다.
함수의 매개변수에는 기본값을 정의할 수 있습니다. 이러한 경우 매개변수를 생략하면 기본값으로 함수를 실행하게 됩니다.
func someFunc(target : String = "Swift") {
print("\(target) 최고")
}
someFunc()
>> Swift 최고
someFunc(target : "Apple")
>> Apple 최고
만약 함수의 매개변수의 기본값을 지정해야 되는 경우가 있다면 매개변수들 중 가장 마지막에 위치하는 것이 좋습니다.
매개변수들은 전달인자 레이블을 통해서 표현할 수 있습니다.
func hello(to friend : String, from me : String) {
print("Hello! \(friend)! I am \(me)")
}
hello(to: "Swift", from: "SangWook")
>> Hello Swift! I am SangWook
이러한 전달인자 레이블은 함수를 호출하는 경우에 사용됩니다. 그리고 실질적으로 함수 내부에서는 매개변수를 통해서 로직을 작성하게 됩니다. 이러한 경우 함수의 역할을 좀 더 명확하게 하거나 사용자의 입장에서 표현하고자 할 경우 사용할 수 있습니다.
func hello(_ friend : String, _ me : String) {
print("Hello! \(friend)! I am \(me)")
}
hello("Swift", "SangWook")
>> Hello Swift! I am SangWook
위처럼 전달인자 레이블을 "_"로 표현하면 전달인자 레이블을 생략할 수도 있습니다.
가변 매개변수는 전달 받을 값의 개수를 알기 어려운 경우 사용하는 방법입니다. 가변 매개변수는 함수당 하나만 가질 수 있습니다.
func hello(from me : String, to friend : String...) {
print("Hello! \(friend)! I am \(me)")
}
hello(from: "SangWook", to: "Swift", "Kotlin", "Dart")
>> Hello ["Swift", "Kotlin", "Dart"]! I am SangWook
가변 매개변수는 생략할 수는 있지만, nil이나 값을 전달하지 않으면 에러가 발생합니다.
Swift는 함수형 프로그래밍 패러다임도 지원합니다. 함수는 1급 객체로 변수나 상수에 저장이 가능하고, 매개변수로 전달 또한 가능합니다.
(a : Int, b : Int) -> Int
위는 a, b를 매개변수로 받아 Int 타입을 반환하는 함수를 데이터 타입으로 표현한 것입니다. ()안에 매개변수를 넣고, 반환타입을 -> 뒤에 명시하면 됩니다. 반환타입은 생략 가능합니다.
func someFunc(a : Int, b : Int) -> Int {
return a + b
}
var someVar : (Int, Int) -> (Int) = someFunc(a:b:)
someFunc(1, 2)
>> 3
someVar(1, 2)
>> 3
이렇게 someVar에 someFunc를 지정하면 변수에 함수를 전달하게 된 것입니다.
func runAnother(a : Int, b : Int, operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
runAnother(a, b) { $0 + $1 }
함수를 매개변수로 전달할 수도 있습니다. 위에 경우에는 클로져 표현으로 표현된 함수가 매개변수로 전달되어 연산을 수행합니다.