조앤의 기술블로그

Tuples (튜플) 본문

Study/Swift

Tuples (튜플)

쬬앤 2020. 2. 18. 17:27
// (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