7.1.3 함수의 반환값과 튜플
함수는 반드시 하나의 값만을 반환합니다. 여러 개의 값을 반환해야 한다면, 집단 자료형에 담아 반환해야 합니다. 이때 말하는 집단 자료형은 딕셔너리나 배열, 튜플, 또는 구조체나 클래스가 있습니다. 이러한 타입 모두 반환 타입으로 사용될 수 있습니다. 이 중 활용도가 높은 튜플의 사용 예시를 보겠습니다.
func getIndvInfo() -> (Int, String) {
let height = 100
let name = "Peter"
return (height, name)
}
var uInfo = getIndvInfo()
uInfo.0 // 100
uInfo.1 // Peter
튜플을 반환하는 함수의 반환값을 대입 받은 변수나 상수는 튜플의 인덱스를 이용하여 내부의 요소를 사용할 수 있습니다.
var (a, b) = getIndvInfo()
a // 100
b // Peter
이렇게 튜플 요소 각각을 변수로 받을 수도 있습니다.
func getIndvInfo() -> (h: Int, n: String) {
let height = 100
let name = "Peter"
return (height, name)
var uInfo = getIndvInfo()
uInfo.h // 100
uInfo.n // Peter
반환값 튜플 인자 앞에 각각의 변수를 붙여 주면 함수의 결과를 받을 때도 이들이 자동으로 바인딩됩니다.
특정 튜플 타입이 여러 곳에서 사용될 경우에는 타입 알리어스를 통해 새로운 축약형 타입을 정의하는 것이 좋습니다. 타입 알리어스는 이름이 길거나 사용하기 복잡한 타입 표현을 새로운 타입명으로 정의해주는 문법으로, typealias 키워드를 사용하여 정의합니다. 이를 사용하면 전체적으로 소스 코드가 간결해지는 효과를 가져올 수 있습니다
typealias <새로운 타입 이름> = <타입 표현>
사용 방법은 간단합니다. typealias 키워드 다음 새로 정의할 타입 이름을 쓰고, 축약할 타입 표현을 대입하면 됩니다. 이를 정의하면 컴파일러는 새로운 타입 이름을 타입 표현과 동일하게 간주합니다.
typealias infoResult = (Int, Character, String)
func getUserInfo() -> infoResult {
let gender: Character = "M"
let height = 100
let name = "Peter"
return (height, gender, name)
}
let info = getUserInfo()
info.0 // 100
info.1 // "M"
info.2 // "Peter"
typealias를 적용하기 전과 후에 딱히 달라진건 없습니다. 단지 함수를 정의하는 부분에만 약간의 변경이 있을 뿐입니다. 타입 알리어스를 이용해 축약 표현을 만들 때 변수가 바인딩된 튜플을 정의할 수도 있습니다.
typealias infoResult = (h: Int, g: Character, n: String)
func getUserInfo() -> infoResult {
let gender: Character = "M"
let height = 100
let name = "Peter"
return (height, gender, name)
}
let info = getUserInfo()
info.h // 100
info.g // "M"
info.n // "Peter"
Last updated