티스토리 뷰

Swift Language Guide

10. 서브스크립트

지우개. 2020. 11. 8. 23:44

클래스, 구조체, 열거형은 서브스크립트를 정의할 수 있습니다. 서브스크립트는 Collection, list 또는 sequence의 요소를 단축어로 쉽게 접근 가능합니다. 서브스크립트를 이용해서 별도의 값 지정 및 검색하는 메소드 없이도 값을 지정하고 검색할 수 있습니다. 예를 들어 Array의 인스턴스인 sommArray[index]가 있다고 가정할 때 인덱스값을 통해 요소에 접근하는 것처럼 말입니다. 

 

같은 타입에 여러개의 서브스크립트를 정의하면  사용하기 적절한 오버로딩된 서브스크립트가 상황에 맞게 선택됩니다. 서브스크립트는 1차원에 머물러있지 않습니다. 또한 당신의 커스텀 타입의 수요에 따라 적절한 여러개의 인풋 파라미터값이 있는 서브스크립트를 정의할 수 있습니다.

 

(공식문서를 읽을 때마다 드는 생각이 있는데 참 어렵게 설명해서 도무지 이해가 안가더라도 막상 내용을 공부하고 나면 찰떡같이 요약해서 설명해놨다는 기분이 든다. 근데 아무리 잘 요약해놨더라도 서문부터 밀도가 너무 높아 이해하기 힘든 내용을 적어놓으면 문서의 의미가 약해지지 않나 라는 생각이 살짝 든다.. )

 

문법

연산 프로퍼티와 유사한 형태. 읽기 전용, set의 newValue 이름 지정 등 바리게이션들도 똑같이 활용가능.

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

subscript(index: Int) -> Int {
    // Return an appropriate subscript value here.
}

사용방법은 배열의 인덱스 참조 형태와 매우매우 비슷하다. 아래 예제는 딕셔너리.

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
        }
    }
    
    var matrix = Matrix(rows: 2, columns: 2)
    
    matrix[0, 1] = 1.5

 

타입 서브스크립트

전, 전전번에 정리했던 프로퍼티, 메소드와 마찬가지로 인스턴스의 종속되지 않은, 타입과 연관된 별도의 것이 존재한다.

문법은 subscript 키워드 앞에 static을 붙여주면 되고 이전에 설명했던 것과 마찬가지로 클래스에서 하위 클래스에서 오버로딩을 허용하고 싶다면 class 키워드를 대신 사용할 수 있다.

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' 카테고리의 다른 글

Optional Chaining(옵셔널 체이닝)  (0) 2020.11.18
11. 상속  (0) 2020.11.09
9. 메소드  (0) 2020.11.06
8. 프로퍼티  (0) 2020.11.03
7. Structures and Classes  (0) 2020.11.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함