2. Functions (1)

Seoyoung Lee·2022년 7월 8일
0
post-thumbnail
post-custom-banner

모든 실행 가능한 코드들은 함수 안에 있어야 한다.

Function Parameters and Return Value

return 키워드는 두 가지 역할을 한다. 첫 번째는 어떤 값을 반환하는 것이고, 두 번째는 함수의 실행을 멈추는 것이다.

어떤 값을 반환하는 함수는 반드시 return 문을 포함해야 한다. 따라서 함수의 본문이 하나의 문장으로 이루어져 있다면 그 문장은 반드시 return 문이어야 한다. 이때 return 키워드는 생략될 수 있다. 이는 SwiftUI 도메인 특화 언어에서 유용하다.

💡 Tip) 의도적으로 함수 호출 결과를 무시하는 경우

함수 호출의 결과로 반환되는 값을 무시하는 경우 컴파일러가 이를 알아채고 경고 메시지를 띄운다. 이를 무시하기 위해서는 함수 호출을 _ 라는 이름 없는 변수에 할당하면 된다. (ex. _ = sum(4, 5))

또 다른 방법으로는 함수를 선언할 때 상단에 @discardableResult 를 적는 방법도 있다.

External Parameter Names

스위프트의 함수는 외부 파라미터(external parameter)를 가질 수 있다. 이는 함수 이름의 부분이고, 인자의 라벨 로 존재해야 한다.

외부 파라미터를 사용하는 이유

  1. 각 인자의 목적을 확실하게 나타낼 수 있다.
  2. 서로 다른 함수들을 구분할 수 있다. 같은 이름과 같은 signature를 갖지만 다른 외부 파라미터 이름을 가진 두 함수가 있다면 둘은 다른 함수이다.
  3. 스위프트가 대부분의 메소드 파라미터가 외부 파라미터 이름을 가지는 Objective-C, Cocoa와 연결되는 데 도움이 된다.

모든 파라미터 이름은 자동으로 외부 파라미터 이름을 가진다. 이때 외부 파라미터 이름은 내부 파라미터의 이름과 같다.

내부 파라미터의 이름과 다르게 외부 파라미터 이름을 짓는 방법엔 두 가지가 있다.

  1. 내부 파라미터 이름 앞에 외부 파라미터 이름을 다르게 짓기
  2. _ 를 이용하기 (→ 함수 호출시 argument label 이름을 생략할 수 있다.)

Overloading

스위프트에서 함수의 오버로딩은 문제가 되지 않고 심지어 흔하게 일어난다. 함수가 오버로딩된다는 것은 외부 파라미터 이름을 포함한 모든 이름과 파라미터, 리턴 타입이 같은 두 함수가 동시에 존재할 수 있다는 것을 의미한다.

오버로딩이 가능한 이유는 스위프트는 자료형을 엄격하게 구분하기 때문이다.

아래 두 함수는 동시에 존재할 수 있다.

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)()

Default Parameter Values

파라미터는 기본 값을 가질 수 있다.

func say(_ s: String, times: Int = 1) {
	for _ in 1...times {
		print(s)
	}
}

times 에 기본 값을 부여함으로써 함수가 두 가지가 있는 것과 같은 효과가 난다.

Variadic Parameters

스위프트에는 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) }
}
profile
나의 내일은 파래 🐳
post-custom-banner

0개의 댓글