2개 이상의 연관된 데이터(값)를 저장하는 Compound(복합/혼합) 타입
예로 들어서 한 사람의 이름과 나이, 사는 지역을 한번에 저장하기 위해서 'person(이름, 나이, 사는지역)'와 같이 데이터를 저장하는 방식이다.
예시)
let twoNumbers: (Int, Int) = (1, 2)
print(type(of: twoNumbers)) // (Int, Int)
let threeNumbers = (1, 2, 5)
print(type(of: threeNumbers)) // (Int, Int, Int)
var threeValues = ("홍길동", 20, "서울")
print(type(of: threeValues)) // (String, Int, String)
print(threeValues.0) // 홍길동
print(threeValues.1) // 20
print(threeValues.2) // 서울
이런 방법 대신 데이터의 각 요소에 이름을 붙일 수 있다!(Named Tuple)
let iOS = (language: "Swift", version: "5")
iOS.0 // "Swift"
iOS.1 // "5"
// 위와 동일한 데이터를 각각 표시한다.
iOS.language // "Swift"
iOS.version // "5"
각각의 타입 같은 경우 타입 추론으로 파악할 수 있다.
let threeNumbers = (1, 2, 5)
let (first, second, third) = threeNumbers
first // 1
second // 2
third // 5
(1, "zebra") < (2, "apple") // true, 1이 2보다 작고; zebra가 apple은 비교하지 않기 때문
(3, "apple") < (3, "bird") // true 왼쪽 3이 오른쪽 3과 같고; apple은 bird보다 작기 때문
(4, "dog") == (4, "dog") // true
("blue", -1) < ("purple", 1) // 비교가능, 결과: true
//("blue", false) < ("purple", true) // 에러발생 ===> Bool 값은 비교 불가능
예시)
let iOS = (language: "Swift", version: "5")
if iOS.0 == "Swift" && iOS.1 == "5" { // 각각을 비교
print("\(iOS.0) 버전 \(iOS.1)입니다.") // Swift 버전 5입니다.
print("\(iOS.language) 버전 \(iOS.version)입니다.") // 위와 동일한 결과
}
if iOS == ("Swift", "5") { // 전체를 한번에 비교
print("\(iOS.0) 버전 \(iOS.1)입니다.") // Swift 버전 5입니다.
print("\(iOS.language) 버전 \(iOS.version)입니다.") // 위와 동일한 결과
}
switch iOS {
case ("Swift", "5"):
print("스위프트 버전 5입니다.")
case ("Swift", "4"):
print("스위프트 버전 4입니다.")
default:
break
}
또한 switch문 바인딩을 이용하여 튜플의 요소를 활용할 수 있다.
var coordinate = (0, 5) // 좌표계
switch coordinate {
case (let x, let y):
print("좌표는 (\(x), \(y)) 입니다.")
default:
break
}
switch coordinate {
case let (x,y) where x == y:
print("좌표는 (\(x), \(y)) 입니다.")
default:
break
}
예시)
var coordinate = (0, 5) // 좌표계
switch coordinate {
case (let distance, 0), (0, let distance): // x축이나 y축에 있으면 출력하라는 코드
print("X 또는 Y축 위에 위치하며, \(distance)만큼의 거리가 떨어져 있음")
default:
print("축 위에 있지 않음")
}
switch coordinate {
case (let x, let y) where x == y: //일단 x, y를 상수로 지정해주고, 그리고 나서 비교한다.
print("(\(x), \(y))의 좌표는 y = x 1차함수의 그래프 위에 있다.")
case let (x, y) where x == -y:
print("(\(x), \(y))의 좌표는 y = -x 1차함수의 그래프 위에 있다.")
case let (x, y):
print("(\(x), \(y))의 좌표는 y = x, 또는 y = -x 그래프가 아닌 임의의 지점에 있다.")
}
튜플을 함수에서 사용할 수 있는데, 예로 들어 String을 함수에 넣었을 때, (Int, String)을 가지는 튜플 형식의 결과를 얻어올 수 있다.
*함수는 원칙적으로 리턴 값이 한 개만 존재하기 때문에 여러개의 값을 반환할 수 없지만, 어떤 묶음 값으로 반환하는 것은 가능하다.