GGURUPiOS

Swift 공식 문서 정리 - (12) Subscripts 본문

Swift/공식문서 정리 ( 문법 )

Swift 공식 문서 정리 - (12) Subscripts

꾸럽 2023. 4. 28. 15:40

Subscripts (서브스크립트)

클래스, 구조체 및 열거형은 컬렉션, 리스트, 시퀀스 등 집합의 특정 멤버 엘리먼트에

간단히 접근할 수 있는 문법임.

서브스크립트를 이용하면 추가적인 메소드 없이 특정 값을 할당 하거나 가져올 수 있음

서브스크립트 문법

서브스크립트를 사용하면 인스턴스의 이름 뒤에 대괄호 안에 하나 이상의 값을 작성하여 유형의 인스턴스를 쿼리할 수 있음

해당 구문은 인스턴스 메서드나, 계산된 프로퍼티 구문과 유사

그러나 인스턴스 메서드와 달리 서브스크립트는 읽기-쓰기 또는 읽기 전용일수 있음

subscript(index: Int) -> Int {
    get {
        // Return an appropriate subscript value here.
    }
    set(newValue) {
        // Perform a suitable setting action here.
    }
}

계산된 프로퍼티와 마찬가지로 setter의 매개변수를 지정하지 않도록 선택 가능

기본값 → newValue 제공

읽기 전용 계산된 프로퍼티와 마찬가지로 키워드와 중괄호 제거하여 단순화 할수 있음

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"

// 정수의 n 배 테이블을 나타내는 구조를 정의하는 읽기 전용 첨자 구현의 예

서브스크립트 사용

서브스크립트는 일반적으로 컬렉션, 목록 또는 시퀀스의 구성원 요소에 접근하기 위한 바로가기로 사용됨

다음은 딕셔너리에서 서브스크립트의 사용 예시임

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
        }
    }
}
// assert? -> 프로그램 바로 종료

위 코드에서는 subscript(row: Int, column: Int) → Double 코드와 같이 두개의 인자를

받고, Double을 반환하는 서브스크립트를 선언함.