조앤의 기술블로그
Tuples (튜플) 본문
// (expr1, expr2, ...)
// Tuple Member
let a = (12, 34)
튜플은 2개 이상의 값을 저장할 때 사용합니다.
서로 다른 형식의 값 저장도 가능합니다.
let data = ("<html>", 200, "ok", 12.34)
data의 자료형은 (String, Int, String, Double)입니다.
튜플은 선언 이후에
- 새로운 멤버를 추가할 수 없습니다.
- 기존 멤버를 삭제할 수 없습니다.
- 저장된 멤버의 개수는 튜플을 선언할 때 결정되고 변경할 수 없습니다.
- 튜플 멤버의 값은 변경할 수 있습니다.
[멤버에 접근하는 법]
튜플은 0-based Index로, Explicit Member Expression(점문법)으로 멤버에 접근할 수 있습니다.
data.o // "<html>"
data.1 // 200
data.2 // "ok"
data.3 // 12.34
여기서 만약
data.1 = 404 처럼 값을 변경하려하면 에러가 납니다.
let data = ... 로 선언했기 때문입니다.
값을 변경할 수 있게하려면 var로 선언하면 됩니다.
var mutableTuple = data
// (mutability : 가변성)
mutableTuple.1 = 404 //변경 가능
이때까지 소개한 튜플은 모두 'Unnamed Tuple'입니다.
Unnamed Tuple은 인덱스로만 접근할 수 있기 때문에 가독성이 떨어집니다.
<Named Tuple>
각 멤버에 name을 붙인 Named Tuple입니다.
// (name1: expr1, name2: expr2, ...)
// tuple.memberName
let namedTuple = (body: "<html>", statusCode: 200, statusMessage: "ok", dataSize: 12.34)
named.1 // 200
named.statusCode // 200
Named Tuple을 활용하면 코드의 가독성이 올라갑니다.
Named Tuple의 멤버는 인덱스로도 접근할 수 있고, name으로도 접근할 수 있습니다.
<Tuple Decomposition>
Decomposition은 '분해'라는 뜻입니다.
Tuple Decomposition은 튜플에 저장된 멤버를 개별 변수 / 상수에 저장하는 것을 말합니다.
// let (name1, name2, ...) = tupleExpr
// var (name1, name2, ...) = tupleExpr
let data = ("<html>", 200, "ok", 12.34)
let body = data.0
let code = data.1
let message = data.2
let size = data.3
이렇게 분해해도 되지만, 너무 번거롭습니다. Decomposition 문법을 사용하면 번거로움을 줄일 수 있습니다.
[Decomposition 문법]
let (body, code, message, size) = data
각 멤버의 수가 같아야 합니다.
특정 멤버를 제외하고 분해하려면 와일드카드 패턴을 활용하면 됩니다.
let (body, code, message, _) = data
<Tuple Matching>
let resolution = (3840.0, 2160.0)
// if문
if resolution.0 == 3840 && resolution.1 == 2160 {
print("4k")
}
if문을 활용해서 튜플 멤버를 확인할 경우 코드가 복잡해집니다.
이때, Switch문을 활용하면 Tuple Matching이 지원되므로, 코드가 단순해집니다.
switch resolution {
//Value Binding
case let (w, h) where w / h == 16.0 / 19.0 :
print("16 : 9")
//Interval Matching
case (3840...4096, 2160):
print("")
case(3840, 2160):
print("4k")
default:
break
}
Value Binding, Interval Matching을 활용하여 case문을 작성할 수도 있으며, 필요한 조건에 case문을 추가해주면 됩니다.
참고 : KxCoding.com - Hello, Swift 강의
'Study > Swift' 카테고리의 다른 글
[Swift] Property(프로퍼티) #2 (0) | 2020.02.20 |
---|---|
[Swift] Property(프로퍼티) #1 (0) | 2020.02.20 |
[Swift] Functions #2 (0) | 2020.02.18 |
Functions #1 (function, return type, parameter) (0) | 2020.02.18 |
[Swift] guard Statement (guard문) (0) | 2020.02.16 |