티스토리 뷰

Programming/Swift

1. Swift : 튜플(Tuple)

INSWAG 2018. 6. 2. 19:34

튜플

(Tuple)



1) 이론적 정의


 * 튜플은 Swift에서 제공하는 특별한 성격의 집단 자료형이며, 배열이나 딕셔너리와는 달리 여러 가지 타입의 아이템을 저장할 수 있다. 


 * 그러나, 선언 후에는 값의 추가나 삭제와 같은 변경이 불가능하다.




2) 문법적 정의


 * 정의 방법 : ( #item1#, #item2#, ... )


 * e.g. let inswag: (Int, String, Bool, Character, Double) = (3, "INSWAG", false, "a", 7.7)




3) 다양한 성격의 튜플이 존재한다.


* Unnamed Tuple (값에 대해 별도의 이름이 없는 튜플)


let threeNumbers: (Int, Int, Int) = (1, 2, 3)

type(of: threeNumbers)                                                <----  (Int, Int, Int).Type


threeNumbers


// 튜플의 각 아이템에 대한 접근 방법  

threeNumbers.0                                                           <----  1

threeNumbers.1                                                           <----  2

threeNumbers.2                                                           <----  3



Reference. 


 - 배열에서의 Index 사용 : threeNumbers[0]


 - 튜플에서의 Index 사용 : threeNumbers.0



var threeValues: (Int, Double, String) = (1, 2.3, "456")

type(of: threeValues)                                                    <---- (Int, Double, String).Type


threeValues                                                                  <---- (.0 1, .1 2.3, .2 "456")             * 빨간 부분이 Index, 검정 부분이 Value


threeValues.0 = 5                                                         <---- 데이터를 집어 넣어줄 수 있다.

threeValues                                                                  <---- 변한 것을 위와 비교하여 확인 : (.0 5, .1 2.3, .2 "456")   





* typealias(타입앨리어스)



Q. 아... 그런데 저 위의 형광펜으로 표시된 표현식이 너무 길어요... 어떻게 방법이 없을까요?


A. typealias 를 사용하면 해결할 수 있습니다.



typealias MyData = (Int, Double, String)                         <---- 데이터가 많아질 때는 타입 앨리어스를 사용해준다.


var threeValues2: MyData                                              <---- 타입 앨리어스 사용으로 정말 간단해진 타입 명시!!!        **개이득**





 * Decompostion(분해)

 


let threeNumbers: (IntIntInt) = (123)


Case 1.


let numbers = threeNumbers

numbers                                                        <---- (.0 1, .1 2, .2 3)

numbers.0                                                     <---- 1

numbers.1                                                     <---- 2


Case 2.


let (first, second, third) = threeNumbers

first                                                                <---- 1

second                                                          <---- 2

third                                                               <---- 3





* Wildcard('_', 언더바) pattern


 - 사용하지 않을 튜플 아이템은 변수나 상수를 정의하는 대신 언더바( _ )로 대체할 수 있다. 


 - 컴파일러는 언더바로 표현된 부분에 해당하는 아이템은 할당하지 않고 지나간다. 



let (_, seconde, thirde) = threeNumbers        <---- (IntIntInt) = (123) 이 let (_, seconde, thirde) 에 할당되었다. 그런데 _ 는 무엇일까? 아래의 결과를 보자


_                                                                    <---- 사용하지 않을 튜플 아이템으로서 _ 를 사용했기 때문에 오류가 발생한다. 

seconde                                                         <---- 2

third                                                               <----  3





 * Named Tuple (값에 대해 이름을 붙여준 튜플)

 

// 기존에 앞에서 했던 방식 : let iOS = ("Swift", "4")

let iOS = (language: "Swift", version: "4")


iOS.0                                                              <---- "Swift"

iOS.1                                                              <---- "4"


iOS.language                                                  <---- "Swift"

iOS.version                                                     <---- "4"






 * Tuple Matching



let somePoint = (1, 1)


switch somePoint {                                                    <---- somePoint의 값에 대한 일치 여부를 확인하는 switch 문. 

case (0, 0):                                                                <---- 불일치

    print("\(somePoint) is at the origin")                      

case (_, 0): // X축                                                      <---- 불일치

    print("\(somePoint) is on the x-axis")            

case (0, _): // Y축                                                      <---- 불일치

    print("\(somePoint) is on the y-axis")

case (-2...2, -2...2):                                                   <---- (1, 1) 이 (-2 ~ 2 사이, -2 ~ 2 사이) 에 포함되므로 일치하는 패턴.

    print("\(somePoint) is inside the box")                  <---- (1,1) is inside the box 출력.

default:

    print("\(somePoint) is outside of the box")

}



 * Tuple & Dictionary

 


let fruits = ["A": "Apple", "B": "Banana", "C": "Cherry"]


- Dictionary의 아이템에는 선수가 없지만 키에는 내부적으로 순서가 있으므로 for ~ in 구문의 사용이 가능하다.


for (key, value) in fruits {

    print(key, value)

}


결과)

C Cherry

B Banana

A Apple


- 자신이 입력한 값의 순서대로 출력이 되지 않은 것은 딕셔너리의 고유 키에 대한 값을 처리하는 기준 때문에 그렇다. 

  그렇기 때문에 자신이 생각하는 순서대로 저장되지 않을 수 있다.



지금까지 튜플(Tuple)에 대해서 알아보았습니다. 틀린 부분이 있으면 댓글로 지적 부탁드립니다


Made by Inswag's Swift in FastCampus 7th iOS Development School


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함