티스토리 뷰
안녕하세요 :) Zedd입니다.
오늘은 어떤분이 Collection시리즈에 tuple은 없냐고 하셔서, tuple을 써볼까 해서 여기저기 찾아봤어요.
사실 tuple은 Swift의 Collection Type이 아니랍니다.
Swift의 Collection Type에는 배열(Array), 사전(Dictionary), 집합(Set).이 있어요.
tuple은..음..tuple을 아직 모르시는 분들이 계실 수 있으니까 지금 자세하게 설명을 드리진 않을게요 :)
tuple의 원소들은 서로 다른 타입일 수 있기때문에 Collection취급을 하지 않는 것 같아요.
그래도 tuple은 Type이랍니다.
이 tuple글을 읽기 전에, < Types > 글을 읽고오시는 것을 추천드릴게요. ㅎㅎ
읽고 오신다면, 이글이 더 이해가 잘 가실거에요.
tuple
사실 Swift에서 tuple은 큰 힘?을 가지고 있지 않아요. 아니 음....덜 유명하달까
다른분들은 어떤지 모르겠지만, 저는 tuple을 거의 쓰지 않아요.
제가 tuple을 잘 몰라서!!!! 그럴수도 있겠죠?
저와 같은 분들을 위해, tuple을 어떻게 쓰는건지 천천히 알아가봅시다.
tuple은 아주아주 간단한 Struct(구조체)라고 생각하시면 편합니다.
여러가지 "타입"을 한꺼번에 묶어서 사용할 수 있어요.
var tuple = (1, "Hello, world!", true)
이렇게요!
그리고 우리 저번시간에 < Types >글에서 배웠죠?
tuple은 compound type으로, named type뿐만아니라, compound type도 담을 수 있다고!!
즉, tuple은 Int, String, Bool과 같은 named type을 담을 수 있지만,
compound type인 tuple type이나, function type을 담을 수 있답니다.
먼저 tuple type을 담아볼까요?
var tuple = (1, "Hello, world!", true)
var anotherTuple = (1, (tuple))
anotherTuple에, 위에서 선언했던 tuple이 들어간 것을 볼 수 있죠?
자, 이렇게 볼 수 있듯이 tuple은 괄호()를 통해 만들 수 있습니다.
(※하나의 타입만을 괄호로 묶는건 아무 소용이 없다고 저번시간에 배웠죠?)
compound type중 tuple type을 담아봤는데요, 이제 function type을 담아볼까요?
func a() -> Int { return 1 }
func b() -> String { return "Zedd" }
func c() -> Bool { return false }
var functionTuple = (a(), b(), c())
이렇게 function type도 담을 수 있다는 걸 보여드리고 싶었어요 :)
자, 그러면 저 tuple안에 있는 값을 어떻게 쓰느냐!
이렇게 tuple의 이름과 점(.)을 찍으면, 저렇게 숫자들이 나오는데요!!인덱스라고 생각하시면 됩니다.
var tuple = (1, "Hello, world!", true)
tuple.0 //1
tuple.1 //"Hello, world!"
tuple.2 //true
인덱스만 찍어주면 바로 그 값에 접근이 가능하답니다 :)
tuple안에 tuple을 넣은 예제도 한번 같이 볼까요?
오 역시 점을 찍으니까! 0번째 인덱스는 그냥 Int였으니까 그냥 Int라고 나오죠?
하지만 1번째 인덱스는 tuple이었으니까, tuple타입이 나오는 것을 알 수 있어요.
anotherTuple에서 tuple의 값을 접근하려면,
이렇게 하면 된답니다.
var tuple = (1, "Hello, world!", true)
var anotherTuple = (1, (tuple))
anotherTuple.0 //1
anotherTuple.1.0 //1
anotherTuple.1.1 //"Hello, world!"
anotherTuple.1.2 //true
짱편하죠?
또 다른 tuple의 사용법을 알려드릴게요 :)
위 예제에서는 tuple의 원소에 "이름"을 주지 않았는데, "이름"을 줄 수 있답니다.
var namedTuple = (name: "Zedd", age: 999, likes : ["Swift","iOS"])
짠! 이렇게 원소에 이름을 줄 수 있어요.
그럼 어떤것이 변하느냐..
아까는 튜플이름하고 점을 찍으면, 인덱스 "번호"가 나왔었죠? 이제는 우리가 줬던 "이름"이 나오게 된답니다.
var namedTuple = (name:"Zedd", age:999, likes: ["Swift","iOS"])
namedTuple.name //"Zedd"
namedTuple.age //999
namedTuple.likes //["Swift","iOS"]
바로 이렇게 쓸 수 있다는 점에서 tuple은 아주 간단한 struct(구조체)라고 하는 것 같아요.
마치 namedTuple이라는 구조체가 있고, 구조체 변수로 name, age, likes가 있는 것 같죠.
어 그럼 구조체말고 tuple쓰면 되자나?
..는 조심해야합니다. Swift문서에 따르면,
Tuples are useful for temporary groups of related values. (…) If your data structure is likely to persist beyond a temporary scope, model it as a class or structure (…)
튜플은 관련된 값들을 임시로 그룹지을때 유용합니다 (...) 만약 데이터구조가 임시범위를 넘어서 존속할 가능성이 있는 경우에는 클래스나 구조체로 모델링하십시오.
라고하네요 :)
tuple에 이름을 주는 것에 대해 더 알아보면,
var namedTuple = (name: "Zedd", age:999, likes: ["Swift","iOS"])
var namedTuple2: (name: String, age: Int, likes: [String]) = ("Zedd", 999, ["Swift","iOS"])
naemdTuple2처럼 아예 이름과 타입을 처음부터 주고 값만 할당해줘도
이름으로 접근이 가능하답니다 :)
또한, 여기서, likes를 보시면서 궁금증이 드시는분들도 계실지도??
tuple에 배열이 들어갈 수 있나요?
네!! 배열도 named Type이기 때문이에요. 배열은 struct로 구현되어 있죠?
※ 나는 이 tuple로 loop를 돌리고 싶다!!하시는 분들이 있을지도 몰라요 :)
하지만..tuple로 for문을 돌리게 되면,
does not conform to protocol 'Sequence'
이러한 에러메세지를 볼 수 있어요.
tuple이 Sequence라는 프로토콜을 준수하고 있지 않기 때문이에요.
그러니까 tuple에 대해서 루프를 돌릴 수 있는 방법은 없습니다.
주의하세요 :)
하지만!!!!!tuple을 Sequence프로토콜을 따르는 녀석?..에게 넣어주면 루프를 돌 수 있다는 말이 됩니다.
Sequence프로토콜을 따르는 대표적인 것은 바로 배열!!
"배열"안에 tuple을 넣어줄 수 있답니다 :)
var tupleArr = [(1, "Hello, world!", true),(2, "Hello, world!",false)]
이렇게요!
하지만, 배열에 tuple을 넣을 때는 주의할 점이 있습니다.
바로, 넣어주는 tuple의 타입과 순서가 모두 같아야합니다.
처음에 Int를 넣어주면 다른 모든 tuple들도 처음에 Int가 들어가야합니다.
역시나 개수도 맞춰줘야하는건 당연하겠죠?
var tuple = (1, "Hello, world!", true)
var anotherTuple = (1,(tuple))
var tupleArr = [tuple,tuple]//OK
var errorTupleArr = [tuple,anotherTuple]//error!!!!
이렇게요.
그럼 루프를 한번 돌려볼까요?
오..역시 인덱스 숫자들로 접근이 가능해지네요 :)
var tupleArr = [(1, "Hello, world!", true) ,(2, "Hello, world!",false)]
for index in tupleArr{
print(index.0)//1 2
print(index.1)//"Hello, world!" "Hello, world!"
print(index.2)//true false
}
이렇게 출력되게 됩니다 XD
원소에 이름을 넣게 되면 index.(이름)이 나오겠죠? :)
자, tuple을 더 알아봅시다.
var tuple = (1, "Hello, world!", true)
var (a,b,c) = tuple
print(a)//1
print(b)//"Hello, world!"
print(c)//true
이렇게!!!! 특정한 이름이 아니더라도, 괄호안에 해당 tuple 개수와 맞게 선언해주면,
이렇게도 쓸 수 있답니다.
제가 선언한 순서대로 tuple에 있는 값이 차례대로 들어가게 되죠XD
아 나는 저 tuple에 있는 값중에 하나만 받아올랭
var (_,b,_) = tuple
print(b)//"Hello, world!"
이렇게 하면, 딱 하나만 받아온답니다 :)
이런식으로 변수 "이름"을 선언안하고, tuple에 tuple을 넣는식으로 할때는,
꼭 넣어주려는 tuple의 개수만큼 tuple개수를 잡아줘야한답니다.
주의하세요 :)
tuple에서 가장 좋은 점은 바로 이제부터 말할 특징이 아닐까 싶은데요,
주로 우리는 함수를 만들 때, 리턴타입이 하나인것을 만들죠?
하지만 tuple은 여러가지 타입을 한번에 리턴할 수 있답니다.
예제를 한번 볼까요?
func someFunction() -> (Int,String,Bool){
return (1,"Zedd",true)
}
짠! 이렇게 tuple을 리턴할 수 있답니다.
그럼 이 someFunction을 사용해볼까요?
func someFunction() -> (Int,String,Bool){
return (1,"Zedd",true)
}
var someTuple = someFunction()
someTuple.0//1
someTuple.1//"Zedd"
someTuple.2//true
var (a,b,c) = someFunction()
print(a)//1
print(b)//"Zedd"
print(c)//true
ㅎㅎㅎㅎ신기하죠?
이렇게 여러 타입들을 한번에 리턴할 수 있다는것이 정말 tuple의 장점인것 같아요XD
이렇게 tuple을 배워보았는데요,
tuple은 typealias와 같이 쓰면 깔끔하게 쓸 수 있답니다.
typealias People = (name:String,age:Int, likes:[String])
People이라는 "타입"을 tuple로 만들어주었어요.
var person : People = ("Zedd",999,["Swift","iOS"])
그럼 이렇게 변수가 "People타입"이라고 해주면, tuple을 받을 수 있게됩니다.
한가지 형식을 가지는 tuple을 여러개 만들 때 유용하겠죠?
var peopleArr : [People] = [("Zedd",999,["Swift","iOS"]),("Your_Name",123,["Piano","Poet"])]
이렇게 People"타입"으로 배열도 만들 수 있겠죠?ㅎㅎ
자..어떠신가요!!
저도 정말 공부가 많이됐어요!!!!!
tuple이 이렇게나 유용했다니XD
이 글이 Swift의 tuple을 이해하는데 도움이 되었으면 좋겠습니다 :)
'Swift' 카테고리의 다른 글
Swift ) Properties - Computed Property(연산 프로퍼티) (7) | 2017.10.07 |
---|---|
Swift ) Properties - Stored Property(저장 프로퍼티) (5) | 2017.10.06 |
Swift ) Types (0) | 2017.10.01 |
Swift ) split에 대한 고찰 (1) | 2017.09.27 |
함수(Function) VS 메소드(Method) (3) | 2017.09.26 |
- iOS delegate
- Git
- Xcode
- SwiftUI
- swift delegate
- WidgetKit
- WKWebView
- IOS
- 스위프트 문법
- Accessibility
- 제이슨 파싱
- swift3
- fastlane
- np-hard
- ios 13
- github
- np-complete
- Swift
- FLUTTER
- swift array
- 회고
- swift sort
- WWDC
- actor
- swift tutorial
- Combine
- 피아노
- 스위프트
- swift 공부
- UIBezierPath
- Total
- Today
- Yesterday