정의
- 컬렉션, 리스트, 시퀀스, 등,, 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있는 문법입니다.
- 클래스, 구조체, 열거형에서 스크립트를 정의해 사용할 수 있습니다.
- 서브스크립트를 통해 추가적인 메서드 없이 특정 값을 할당하거나 가져올 수 있습니다.
형식
- 인스턴스 메서드와 계산 프로퍼티를 선언하는 것과 비슷합니다.
- 인스턴스 메서드와 다른 점은, 서브스크립트는 읽고-쓰기 혹은 읽기 전용만 가능하다는 것입니다.
- 계산 프로퍼티와 같이 setter, getter 방식을 사용합니다.
- 서브스크립트의 set 인자 값을 지정하지 않으면 기본 값인 newValue를 사용합니다.
subscript(index: Int) -> Int {
get {
// 반환 값
}
set(newValue) {
// set 액션
}
}
- 읽기 전용으로 선언하려면, get과 set을 지우고 따로 지정하지 않으면 읽기 전용으로 선언됩니다.(단, get으로 동작)
subscript(index: Int) -> Int {
// 반환 값
}
예제
읽기 전용 서브스크립트
- TimesTable이라는 구조체를 생성했습니다.
- 해당 구조체의 multiplier를 3으로 지정하고, threeTimesTable의 값은 6으로 설정했습니다.
- 그럼 지정한 값인 multiplier의 값 3과 threeTimesTable의 6번째 값인 6을 연산한 3*6의 결괏값이 출력됩니다.
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
서브 스크립트 사용
- numberOfLegs 값은 타입 추론에 의해 [ String: Int ] 형을 갖습니다.
- numberOfLegs ["bird"] = 2는 사전형 변수 numberOfLegs에 key로 bird의 값은 2를 넣으라는 서브 스크립트입니다.
- 해당 변수의 사전 반환 값은 옵셔널 값입니다.
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
서브 스크립트 옵션
- 서브 스크립트는 입력 인자의 수 제한이 없고, 입력 인자의 타입과 반환 타입의 제한도 없습니다.
- 다만, in-out 인자나 기본 인자 값을 제공할 수는 없습니다.
- 스크립트는 오버 로딩도 허용합니다.
- 다음 예제는 서브 스크립트를 이용해 다차원 행열을 선언하고 접근하는 예제입니다.
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
}
}
}
- (row: Int, column: Int) -> Double과 같이 row, column 2개의 인자를 받고, Double을 반환하는 서브 스크립트를 선언했습니다.
- get과 set에는 각각 indexIsValid 메서드를 사용해 유효한 인덱스가 아닌 경우에 프로그램이 종료되도록 assert를 호출했습니다.
- 선언한 서브스크립트 문법을 통해 2X2 행렬을 선언할 수 있습니다.
- grid 배열을 서브 스크립트에 의해 위와 row와 column을 갖는 행렬도 동작합니다.
- 행렬에 서브 스크립트를 이용해 특정 row와 column에 값을 저장할 수 있습니다.
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
- 값을 넣은 결과, 행렬의 모습입니다.
0.0 | 1.5 |
3.2 | 0.0 |
- 행렬의 입출력 시 row와 column의 범위가 적절한지 아래의 함수로 확인할 수 있습니다.
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
- 만약 적절한 범위를 벗어난다면 assert가 실행됩니다.
- 다음은 assert의 이해를 돕기 위한 참고 글입니다.
2022.01.28 - [iOS/Swift 문법 심화 학습] - assert
내용 출처
https://jusung.gitbook.io/the-swift-language-guide/language-guide/12-subscripts
'iOS > Swift 문법 심화 학습' 카테고리의 다른 글
Optional (0) | 2022.04.12 |
---|---|
컬렉션 타입 [Collection Types] (0) | 2022.02.17 |
프로퍼티 [ Properties ] (0) | 2022.02.14 |
옵셔널 체이닝 [ Optional Chaining ] (0) | 2022.02.10 |
inout (0) | 2022.02.09 |
댓글