티스토리 뷰

반응형

튜플(Tuples)

🗜 튜플이란?

  • 여러가지 타입들을 묶어 하나의 타입으로 선언해주는 것입니다. 2개 뿐만 아니라 3개 이상의 타입의 값들도 튜플로 묶일 수 있으며 이렇게 묶인 튜플은 타입이 사용될 수 있는 곳이라면 어디서도 사용 가능합니다.

💻 튜플의 사용 방법

  • 튜플의 사용 예시는 아래와 같습니다.
  • // 1. 튜플의 요소 수만큼 변수를 할당해 사용 let x: (String, Int, Double) = ("hello", 5, 0.5) let (word, number, value) = x // tuple에 접근할 때 요소들이 이름을 갖습니다. // 요소의 개수가 맞지 않는다면 컴파일 에러가 발생합니다. print(word) print(number) print(value) // 2. 튜플을 정의할 때 element에 이름을 붙여주기 let x: (w: String, i: Int, v: Double) = ("hello", 5, 0.5) print(x.w) print(x.i) print(x.v)

👍 튜플의 장점

  • Swift에서 함수는 반환값의 타입을 명시해주어야 하기 때문에 여러 타입의 값을 반환하기 어렵기 때문에 튜플을 사용하면 함수에서 여러개의 값, 여러 타입의 값을 반환할 수 있습니다.
  • 여러 요소 중 무시해도 되는 값이 있다면 _(under bar)를 활용해서 해당 요소를 무시할 수 있습니다.
  • swift에서 _(under bar)는 이걸 무시하겠다는 문자로 사용됩니다.
  • 각 요소의 이름을 설정할 수 있습니다.
  • func getSize() -> (weight: Double, height: Double) { return (250, 80) } let x = getSize() print("weight is \(x.weight)") // return 타입에 네이밍한 튜플을 설정함으로써 결과값에 이름을 통해 접근할 수 있습니다.

Range

📌 Range의 정의

  • Range는 무엇이든 연속적으로 표현될 수 있는 것의 양 끝점을 가르킵니다.(A Range in Swift is just two end points)
  • Range는 Array와 같이 제네릭(Generic)으로(Range) Int, Index 등 다양한 타입의 Range를 생성할 수 있습니다.

📎Array에서의 Range와 String에서의 Range

  • Array에서의 Range와 String에서의 Range는 다릅니다. 실제로 코딩을 하는 과정에서 만난 오류로 이 개념이 기존에 사용하던 언어와 달라 오랫동안 고민해야 했습니다. 아래는 Range의 수도코드 입니다.
  • struct Range<T> { var startIndex: T var endIndex: T }
  • 위와 같이 Range에는 시작점(startIndex)과 끝점(endIndex)이 구현되어 있습니다. Array의 경우 index로 요소가 구별되기 때문에 Range는 Int로 구현됩니다. Array의 범위를 설정하는데 Int형으로 된 Range를 사용하게 됩니다. 반면에 String의 경우 Range가 String.Index로 구현되어 있습니다(Range<String.Index>). 그래서 문자열을 슬라이싱(Slicing)할 때에, Python에서처럼 Int형 인덱스를 활용해 슬라이싱하게되면 오류가 발생합니다. SubString을 위해서는 Int가 아닌 String.Index가 필요합니다.
  • let array = ["a","b","c","d"] let subArray1 = array[2...3] let subArray2 = array[2..<3]

Reference: Stanford CS193p by Paul Hegarty

반응형
댓글