Swift의 데이터 타입을 공부하던 중, 기존에 알고 있던 언어(Javascript)에는 없는 자료형을 발견해서, '신기하다... 배열이랑 비슷하네' 정도의 소감을 가지고 익혔는데 문득, 실제 개발시 튜플을 활용하면 좋은 상황을 미리 알아두면 좋겠다 싶어서 추가적으로 알아보기로 했다.
let 우리고양이 = ("까까", "Black", 7)
튜플이란 ()
안에 여러가지 표현식이 들어가 있는 자료형을 말한다.
()
안에는 위의 예시처럼 여러가지 타입이 섞여 들어가도 관계가 없다.
print(type(of: 우리고양이)) // (String, String, Int)
.
을 통해 멤버에 접근할 수 있다.
우리고양이.0 == "고양이"
우리고양이.1 == "Black"
우리고양이.2 == 7
let 우리고양이 = (name: "까까", color: "Black", age: 7)
라벨로 이름을 붙일 수 있고, .
뒤에 index가 아닌 라벨을 통해 접근 가능하다.
kkakka.name == "까까"
kkakka.color == "Black"
kkakka.age == 7
let 우리고양이 = (name: "까까", color: "Black", age: 7)
let (name, color, age) = 우리고양이
이런식으로 구조를 분해해서 할당할 수 있다.
위에 적은 내용이 튜플의 기본적인 활용법인데, 사실 튜플 안에는 배열도 함수도 들어갈 수 있다. 튜플을 보다 다양하게 사용하는 예시를 살펴보자
let 해상도 = (3840.0, 2160.0)
func 해상도알려주는함수 (가로: Double, 세로: Double) -> String {
let 해상도 = (가로, 세로)
switch 해상도 {
case(3840...10000, _):
return "와이드모니터 같은데요?"
case (3840.0, 2160.0):
return "4k"
case (2560, 1440) :
return "QHD"
case (1920, 1080) :
return "FHD"
case let (x, y) where x == y:
return "정사각형 모니터...?"
case let (x, y) where x < y:
return "가로랑 세로를 잘못 입력하신거 같아요"
default:
return "이상한데요?"
}
}
print(해상도알려주는함수(가로: 2160, 세로: 5000))
튜플을 활용하면, 더 다양한 타입의 데이터 타입을 한 배열에 넣을 수 있다.
var catArr : [(name: String, age: Int)] = []
catArr.append((name : "까까", age : 7))
catArr.append((name : "루", age : 4))
print(catArr)
print(catArr[0].name) // 까까
for (index, element) in catArr.enumerated() {
print("\(index + 1)번째 고양이는 \(element.name)이고, 나이는 \(element.age)살 입니다.")
}
/*
1번째 고양이는 까까이고, 나이는 7입니다.
2번째 고양이는 루이고, 나이는 4입니다.
*/
간단한 유저 정보 등을 배열 속에 넣어서 관리할 때 유용하게 사용할 수 있을 것 같다.
let 우리고양이 = (name: "고양이", color: "Black", age: 7, likes: ["츄르", "냉장고", "캣폴"])
print(우리고양이.likes) // ["츄르", "냉장고", "캣폴"]
for 좋아하는거 in 우리고양이.likes {
print(좋아하는거)
}
이처럼 튜플 안에 배열을 넣어서 디테일한 정보를 담을 수 있다.
func getName () -> String {
return "김대성"
}
func getAge () -> Int {
return 99
}
let userInfo = (name : getName(), age : getAge())
print(userInfo.name, userInfo.age) // 김대성 99
func 주식계산기 (name: String, price: Double, amount: Double) -> (name: String, value: Double) {
return (name, price * amount)
}
let 삼성전자 = 주식계산기(name: "삼성전자", price: 67400, amount: 50)
let 현대자동차 = 주식계산기(name: "현대자동차", price: 186000, amount: 20)
let 네이버 = 주식계산기(name: "네이버", price: 286500, amount: 10)
let 내주식 = (삼성전자, 현대자동차, 네이버)
print("\(내주식.0.name)을 \(내주식.0.value)만큼 들고 있습니다.")
함수 값을 튜플에 담는 것 역시 가능하다.
func calculateTip(billAmount: Double, tipPercent: Double) -> (tipAmount: Double, totalAmount:Double) {
let tip = billAmount * (tipPercent / 100)
let total = billAmount + tip
return (tipAmount: tip, totalAmount: total)
}
print(calculateTip(billAmount: 1000, tipPercent: 10))
let (tipAmount, totalAmount) = calculateTip(billAmount: 1000, tipPercent: 20)
print(tipAmount, totalAmount)
멀티 리턴 함수를 만들어서 활용할 수 있다.
리턴되는 타입이 복잡할 경우 typealias
를 통해 관리할 수 있다.
typealias TipType = (tipAmount: Double, totalAmount:Double)
func calculateTip(billAmount: Double, tipPercent: Double) -> TipType {
let tip = billAmount * (tipPercent / 100)
let total = billAmount + tip
return (tipAmount: tip, totalAmount: total)
}