[Swift] 서브스크립트(Subscript)

728x90

서브스크립트(Subscript)에 대해 알아 보겠습니다.

 

서브스크립트

서브스크립트는 Class, Struct, Enum에서 콜렉션, 순열, 리스트 등의 멤버 요소에 쉽게 접근하기 위한 방법입니다.
인스턴스의 이름 뒤에 대괄호로 감싼 값을 써줌으로써 인스턴스 내부의 특정 값에 접근할 수 있습니다.

설정자(Setter)와 접근자(Getter)메서드를 구성하지 않고도 인덱스를 통해 어떤 값을 빠르게 설정하거나 가져올 수 있습니다.

예를들어 arr이라는 Array 인스턴스의 index를 통해 해당 인덱스의 값에 접근하고 싶다면 arr[index]라고 표현해서 쓴것들이 서브스크립트 입니다.

 

Subscript Syntax

subscript키워드 사용.
서브스크립트를 구현하는 코드는 각 타입의 구현부 또는 타입의 익스텐션 구현부에 위치해야합니다.

subscript(index: Int) -> Int {
  get {
    // 서브스크립트 결괏값 반환
  }

  set(newValue) {
    // 설정자 코드
  }
}

// get, set 키워드를 사용하지 않고 적절한 값만 반환해주는 형태로 구현해도 됩니다.

subscript(index: Int) -> Int {
  // 적절한 서브스크립트 결괏값 반환
}

 

사용법 예제
예제를 이용해서 알아 보도록 하겠습니다.

 

1. 첫번째

struct TimeTable {

  let multiplier: Int

  subscript(index: Int) -> Int {
    return multiplier * index
  }
}

//six times three is 18
let threeTimesTable = TimesTable(multiplier: 3)

//five times seven is 35
print("six times three is \(threeTimesTable[6])")

 

2. 두번째

struct Student {
    var name: String
    var number: Int
}

class School {
    var number: Int = 0
    var student: [Student] = [Student]()
    
    func addStudent(name: String) {
        let student: Student = Student(name: name, number: self.number)
        self.student.append(student)
        self.number += 1
    }
    
    subscript(index: Int) -> Student? {
        guard index < self.number else { return nil }
        
        return self.student[index]
    }
    
}

let middleSchool: School = School()
middleSchool.addStudent(name: "김승진")
middleSchool.addStudent(name: "김땡댕")
middleSchool.addStudent(name: "홍길동")

//서브스크립트(첨자)로 접근 가능
print(middleSchool[0]!) // Student(name: "김승진", number: 0)
print(middleSchool[1]!.name) // 김땡땡
print(middleSchool[2]!) // Student(name: "홍길동", number: 2)

 

3. 세번째 (Extension 활용)

extension String {

  // 1. 자연수를 입력 받아 해당 인덱스에 위치한 문자(Character)를 반환하는 Subscript 구현
  // str[0] - "H",  str[5] - ","

  subscript(intIndex: Int) -> Character {
    if intIndex >= 0 {
        return self[self.index(startIndex, offsetBy: intIndex)]
    } else {
        return self[self.index(startIndex, offsetBy: count + intIndex)]
    }
  }


  // 2. IntRange ( ..< ) 를 입력받아 해당 범위의 문자열(String)을 반환하는 Subscript 구현
  // str[0 ..< 2] - "He",    str[2 ..< 6] - "llo,"
    
  subscript(intRange: Range<Int>) -> String {
    return String(self[index(startIndex, offsetBy: intRange.lowerBound)..<index(startIndex, offsetBy: intRange.upperBound)])
  }
}


let str = "Hello, World!"

str[0] // "H"
str[5] // ","

str[0..<2] // "He"
str[2..<6] // "llo,"