티스토리 뷰
Subscripts — The Swift Programming Language (Swift 5.5)
Subscripts Classes, structures, and enumerations can define subscripts, which are shortcuts for accessing the member elements of a collection, list, or sequence. You use subscripts to set and retrieve values by index without needing separate methods for se
docs.swift.org
1차 수정 (2022 / 02 / 27) : 의역, 오타 및 스타일 수정
Subscripts
클래스, 구조체, 열거형은 서브스크립트(subscripts)를 정의할 수 있습니다. 서브스크립트는 컬렉션, 리스트, 시퀀스(sequence)의 멤버 요소에 빠르게 접근할 수 있습니다. 설정 및 검색에 대한 별도의 방법 없이, 인덱스를 통해 값을 설정하고 검색하기 위해 서브스크립트를 사용합니다. 예를 들어, 배열 인스턴스의 요소(elements) 에 접근하기 위해 someArray[index] 처럼 사용하고, Dictionary 인스턴스의 요소에 접근하기 위해 someDictionary[key] 와 같이 표현합니다.
단일 타입에 대해 여러 개의 서브스크립트를 정의할 수 있으며, `서브스크립트에 전달하는 인덱스 값의 타입`에 따라 적절한 서브스크립트를 오버로드(중복 정의) 할 수도 있습니다. 서브스크립트는 단일(single) 차원으로 제한되지 않으며, 사용자 필요에 맞게 여러 개의 파라미터를 사용하여 정의할 수 있습니다.
Subscript Syntax (서브스크립트 구문)
서브스크립트를 사용하면 인스턴스 이름 뒤에 대괄호로 하나 이상의 값을 작성하여 타입의 인스턴스를 쿼리(query) 할 수 있습니다. 서브스크립트는 인스턴스 메소드 구문과 연산 프로퍼티 구문과 비슷합니다. subscript 키워드를 사용해 정의하며, `인스턴스 메소드와 동일하게` 한 개 혹은 그 이상의 파라미터와 리턴 타입을 사용할 수 있습니다. 인스턴스 메소드와는 다르게, 서브스크립트는 read-write 혹은 read-only 입니다. 이 동작은 getter setter에 의해 동작되는 연산 프로퍼티와 같은 방식입니다.
subscript(index: Int) -> Int {
get {
// Return an appropriate subscript value here.
}
set(newValue) {
// Perform a suitable setting action here.
}
}
newValue의 타입은 서브스크립트의 리턴 값과 같습니다. 연산 프로퍼티처럼 setter의 newValue 매개변수를 사용하지 않아도 됩니다. 사용자가 파라미터 이름을 제공하지 않아도, 기본 파라미터 newValue가 setter에 제공됩니다.
read-only(읽기 전용) 연산 프로퍼티처럼 get 키워드를 지워, 읽기 전용 서브스크립트 구문으로 간단하게 정의할 수 있습니다.
subscript(index: Int) -> Int {
// Return an appropriate subscript value here.
}
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// Prints "six times three is 18"
읽기 전용 서브스크립트에 대한 예제입니다. TimesTable의 새로운 인스턴스가 threeTimesTable에 나타납니다. multiplier파라미터의 값으로 3을 받습니다. threeTimesTable[6] 처럼 서브스크립트를 사용해 쿼리할 수 있습니다.
Subscript Usage(서브스크립트 용도)
서브스크립트의 정확한 의미는 어디서 사용되는가에 따라 결정됩니다. 서브스크립트는 전형적으로 컬렉션, 리스트, 시퀀스의 멤버 요소에 손쉽게 접근하기 위해 사용됩니다. 특정 클래스 또는 구조체의 기능에 가장 적절한 방법으로 서브스크립트를 자유롭게 구현할 수 있습니다.
예를 들어 Swift의 Dictionary 타입은 Dictionary 인스턴스에 저장된 값을 검색하고 서브스크립트를 구현합니다. 서브스크립트 괄호에 dictionary 키 타입의 키를 제공하고 dictionary의 값 타입의 값을 서브스크립트에 할당하여, 값을 설정할 수 있습니다.
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
예제에서 numberOfLegs라는 변수를 정의하고 dictionary key-value 로 초기화합니다. numberOfLegs dictrionart의 타입은 [String:Int] 로 추론됩니다. dictionary를 만들고 나서, 서브스크립트 할당을 사용해서 dictionary에 "bird" 키와 "2" 값을 추가합니다.
Swift의 Dictionary 타입은 key-value 를 옵셔널 타입으로 사용하고 리턴하는 서브스크립트로 구현합니다. 예제의 numberOfLegs의 경우 key-value 서브 스크립트는 Int? 또는 Optional Int 타입의 값을 가져와 리턴합니다. Dictionary 타입은 옵셔널 서브스크립트 타입을 사용해, 일부 키에 값이 없는 경우를 모델링하고 해당 키에 0을 할당하여 키 값을 삭제하는 방법을 제공합니다.
Subscript Options(서브스크립트 옵션)
서브스크립트는 입력 파라미터를 몇 개든지 다 사용할 수 있고, 어떤 타입이든 될 수 있습니다. 서브스크립트는 모든 타입의 값을 반환합니다.
함수처럼, 서브스크립트는 다양한 숫자의 파라미터를 가질 수 있고 파라미터에 기본값(default value)를 제공합니다. 하지만 함수와는 다르게 서브스크립트는 in-out 파라미터를 사용할 수 없습니다.
클래스 혹은 구조체는 필요한만큼의 서브스크립트를 제공할 수 있고, 사용될 서브스크립트는 `값의 타입` 혹은 `서브 스크립트가 사용되는 지점에서 대괄호 [] 안에 포함되는 값`에 기반하여 추론됩니다. 이 여러 개의(multiple) 서브스크립트 정의는 subscript overloading으로 정의됩니다.
서브스크립트가 단일 매개변수를 갖는 것은 흔하지만, 타입에 적절하게 여러 파라미터를 서브스크립트로 정의할 수도 있습니다.
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
}
}
}
Matrix 구조체의 서브스크립트는 두 개의 intger 파라미터를 가집니다. rows 와 columns 두 개의 파라미터를 갖는 이니셜라이져가 있으며, Double 타입의 rows*columns 크기 배열을 생성합니다. 행렬의 초기값은 0.0으로 주어집니다.
row와 column에 적절한 값을 주어 새로운 Matrix 인스턴스를 생성할 수 있습니다.
var matrix = Matrix(rows: 2, columns: 2)
grid 배열은 일차원 배열이지만, 읽을 때는 왼쪽 위에 오른쪽 아래로 읽습니다.
rows와 columns를 , 로 구분해 서브스크립트에 작성하면 행렬의 값을 설정할 수 있습니다.
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
그림과 같이 행렬이 설정이 됩니다.
Matrix 서브스크립트의 getter와 setter는 서브스크립트의 row와 column 값이 유효한지 확인하는 assertion을 포합합니다. Matrix는 indexisValid(row:column:)이라는 메소드를 포함해 row와 column이 범위 내에 있는지 확인합니다.
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
행렬의 범위에서 벗어난 값에 접근하려고 하면 Assertion을 일으킵니다.
let someValue = matrix[2, 2]
// This triggers an assert, because [2, 2] is outside of the matrix bounds.
+ assertion 이란? 프로그램의 특정 지점에서 반드시 True 여야 한다고 생각하는 사항을 표현한 논리식
Type Scripts(타입 스크립트)
인스턴스 서브스크립트는 특정 타입의 인스턴스로써 서브스크립트를 호출합니다. 서브스크립트를 타입 그 자체로 호출하도록 선언할 수 있습니다. 이러한 서브스크립트를 타입 스크립트(type script)라고 부릅니다. subscript 키워드 앞에 static 키워드를 작성해 사용할 수있습니다. 클래스는 class 키워드를 대신 사용해, 하위 클래스가 해당 서브스크립트의 슈퍼클래스(최상위 클래스)의 구현을 재정의(override) 할 수 있습니다.
예제는 타입 서브스크립트를 정의하고 호출하는 것을 보여줍니다.
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 > Swift 공식문서' 카테고리의 다른 글
[Swift] 공식문서 14 - Initialization (초기화) (0) | 2021.10.26 |
---|---|
[Swift] 공식문서 13 - Inheritance (상속) (0) | 2021.10.24 |
[Swift] 공식문서 11 - Methods(메소드) (0) | 2021.10.22 |
[Swift] 공식문서 10 - Properties (프로퍼티) (0) | 2021.10.19 |
[Swift] 공식문서 09 - Structures and Classes(구조체와 클래스) (0) | 2021.10.16 |
- Total
- Today
- Yesterday
- 코딩 테스트
- Swift문법
- 코딩테스트
- 개발
- 앱개발
- 코딩
- Swift공식문서
- swiftUI 기초
- Swift
- Combine
- 책후기
- Swift 서버
- 책리뷰
- 책
- 디자인 패턴
- Swift DocC
- 부스트캠프
- Swift 디자인 패턴
- 부스트캠프7기
- TODO
- 부스트캠프iOS
- vapor
- 프로그래머스
- 필독서
- 날씨어플
- UX
- ios
- 애플
- todo앱
- SwiftUI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |