서브 스크립트(Subscripts)
- 설정과 검색을 위한 별도의 메서드 없이 인덱스로 값을 설정하고 조회하기 위해 서브 스크립트를 사용
서브 스크립트 구문(Subscript Syntax)
subscript
키워드로 서브 스크립트 정의를 작성하고 인스턴스 메서드와 같은 방법으로 하나 이상의 입력 파라미터와 반환 타입을 작성
- 인스턴스 메서드와 다르게 서브 스크립트는 읽기-쓰기 또는 읽기전용이 될 수 있다
- 이러한 동작은 계산된 프로퍼티와 같은 방법으로
getter
와 setter
를 통해 동작
subscript(index: Int) -> Int {
get {
}
set(newValue) {
}
}
- newValue 의 타입은 서브 스크립트의 반환 값과 동일하다.
- 계산된 프로퍼티와 마찬가지로
setter
의 (newValue)
파라미터를 지정하지 않도록 선택할 수 있다
- 파라미터를 지정하지 않으면
setter
에 newValue
라는 기본 파라미터가 제공
- 읽기전용 계산된 프로퍼티와 마찬가지로
get
키워드와 그것의 중괄호를 삭제하여 읽기전용 서브 스크립트를 쉽게 선언할 수 있다
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("\(threeTimesTable[6])")
서브 스크립트 사용(Subscript Usage)
- "서브 스크립트"의 정확한 의미는 사용되는 컨텍스트에 따라 다르다
- 일반적으로 서브 스크립트는 콜렉션, 목록, 또는 시퀀스에 멤버 요소에 접근하는 바로가기로 사용
- 특정 클래스 또는 구조체의 기능에 가장 적합한 방식으로 서브 스크립트를 자유롭게 구현할 수 있다
예를 들어 Swift의 Dictionary
타입은 Dictionary
인스턴스에 저장된 값을 설정하고 조회하기 위해 서브 스크립트를 구현한다. 서브 스크립트 대괄호 내에 딕셔너리의 키 타입의 키를 제공하고 딕셔너리의 값 타입의 값을 서브 스크립트에 할당하여 딕셔너리에 값을 설정할 수 있다
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
서브 스크립트 옵션(Subscript Options)
- 서브 스크립트는 여러개의 입력 파라미터를 가질 수 있고 입력 파라미터는 어떤 타입도 가능하다
- 서브 스크립트는 어떤 타입도 반환할 수도 있다
- 함수와 다르게 서브 스크립트는
in-out
파라미터를 사용할 수 없다
- 여러개의 서브 스크립트 정의를 서브 스크립트 오버로딩
subscript overloading
이라 한다.
- 대부분 서브 스크립트는 하나의 파라미터를 가지지만 적절한 타입에 경우 여러개의 파라미터를 가진 서브 스크립트를 정의할 수도 있다
-2개의 정수 파라미터 서브 스크립트:
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
var matrix = Matrix(rows: 2, columns: 2)
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
타입 서브 스크립트(Type Subscripts)
- 타입 자체에서 호출되는 서브 스크립트
subscript
키워드 전에 static
키워드를 작성하여 타입 서브 스크립트를 구현
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
static subscript(n: Int) -> Planet {
return Planet(rawValue: n)!
}
}
let mars = Planet[4]
print(mars)
swift Language guide를 참조