본문 바로가기
iOS/Swift 문법 심화 학습

서브스크립트 [ Subscript ]

by 황민우 2022. 2. 15.

정의

- 컬렉션, 리스트, 시퀀스, 등,, 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있는 문법입니다.

- 클래스, 구조체, 열거형에서 스크립트를 정의해 사용할 수 있습니다.

- 서브스크립트를 통해 추가적인 메서드 없이 특정 값을 할당하거나 가져올 수 있습니다.


형식

- 인스턴스 메서드와 계산 프로퍼티를 선언하는 것과 비슷합니다.

- 인스턴스 메서드와 다른 점은, 서브스크립트는 읽고-쓰기 혹은 읽기 전용만 가능하다는 것입니다.

- 계산 프로퍼티와 같이 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

 

assert

정의 assert문은 특정 조건을 체크하고, 조건이 성립되지 않으면 메세지를 출력합니다. 실제 앱 성능엔 영향을 끼치지 않고, 디버깅 모드에서만 동작되는 특징이 있습니다. 선언 형식 - 총 4개의

seagreen83.tistory.com


내용 출처

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

댓글