모든 실행 가능한 코드들은 함수 안에 있어야 한다.
return
키워드는 두 가지 역할을 한다. 첫 번째는 어떤 값을 반환하는 것이고, 두 번째는 함수의 실행을 멈추는 것이다.
어떤 값을 반환하는 함수는 반드시 return 문을 포함해야 한다. 따라서 함수의 본문이 하나의 문장으로 이루어져 있다면 그 문장은 반드시 return 문이어야 한다. 이때 return
키워드는 생략될 수 있다. 이는 SwiftUI 도메인 특화 언어에서 유용하다.
함수 호출의 결과로 반환되는 값을 무시하는 경우 컴파일러가 이를 알아채고 경고 메시지를 띄운다. 이를 무시하기 위해서는 함수 호출을 _
라는 이름 없는 변수에 할당하면 된다. (ex. _ = sum(4, 5)
)
또 다른 방법으로는 함수를 선언할 때 상단에 @discardableResult
를 적는 방법도 있다.
스위프트의 함수는 외부 파라미터(external parameter)를 가질 수 있다. 이는 함수 이름의 부분이고, 인자의 라벨
로 존재해야 한다.
모든 파라미터 이름은 자동으로 외부 파라미터 이름을 가진다. 이때 외부 파라미터 이름은 내부 파라미터의 이름과 같다.
내부 파라미터의 이름과 다르게 외부 파라미터 이름을 짓는 방법엔 두 가지가 있다.
_
를 이용하기 (→ 함수 호출시 argument label 이름을 생략할 수 있다.)스위프트에서 함수의 오버로딩은 문제가 되지 않고 심지어 흔하게 일어난다. 함수가 오버로딩된다는 것은 외부 파라미터 이름을 포함한 모든 이름과 파라미터, 리턴 타입이 같은 두 함수가 동시에 존재할 수 있다는 것을 의미한다.
오버로딩이 가능한 이유는 스위프트는 자료형을 엄격하게 구분하기 때문이다.
아래 두 함수는 동시에 존재할 수 있다.
func say() -> String {
return "one"
}
func say() -> Int {
return 1
}
어떤 say
함수를 호출하는지 정확하게 구분되는 경우와 구분이 되지 않는 경우는 다음과 같다.
// ambiguous
let result = say()
// disambiguate
func giveMeAString(_ s: String) {
print("thanks!")
}
let result = say() + "two"
let result = (say as () -> String)()
파라미터는 기본 값을 가질 수 있다.
func say(_ s: String, times: Int = 1) {
for _ in 1...times {
print(s)
}
}
times
에 기본 값을 부여함으로써 함수가 두 가지가 있는 것과 같은 효과가 난다.
스위프트에는 Variadic Parameter(가변 파라미터)가 존재한다. 여러 값들을 인자로 가지면 함수 본문에서는 이들을 배열로 받게 된다.
// 가변 파라미터 예시
func sayStrings(_ array: String ...) {
for s in array { print(s) }
}
가변 파라미터 바로 다음에 다른 파라미터가 올 경우에는 가변 파라미터가 끝나는 지점을 명시하기 위해 external label을 붙여주어야 한다.
스위프트 5.4 버전 이후에는 여러 개의 가변 파라미터를 사용할 수 있다. 이때도 가변 파라미터 바로 다음 가변 파라미터가 올 경우에는 external label을 붙여주어야 한다.
for sayStrings(_ array: String ..., other: String, _ array2: String ...) {
for s in array { print(s) }
print(other)
for s in array2 { print(s) }
}