본문 바로가기
⌨️ Language/swift

[Swift] 서브스크립트

by hyebin (Helia) 2024. 3. 22.

서브스크립트(Subscripts)

  • 클래스, 구조체, 그리고 열거형에서 스크립트를 정의해 사용 가능
  • 콜렉션, 리스트, 시퀀스 등 집합의 특정 멤버 엘리먼트에 간단하게 접근 할 수 있는 문법
  • 추가적인 메소드 없이 특정 값을 할당하거나 가져올 수 있음
  • 하나의 타입에 여러 서브스크립트를 정의할 수 있고 오버로드(Overload)도 가능
  • 단일 인자 값을 넘어, 필요에 따라 복수 인자 값 사용 가능

서브스크립트 문법 (Subscript Syntax)

  • 서브스크립트는 읽고-쓰기(read-write) 혹은 읽기 전용(read only)만 가능
  • setter, getter 방식을 따름
subscript(index: Int) -> Int {
    get {
    	// 적절한 반환 값
    }
    set(newValue) {
        // 적절한 set 액션
    }
}
  • set에 대한 인자 값을 따로 지정하지 않으면 기본 값으로 newValue를 사용
  • get, set을 지우고 따로 지정하지 않으면 get으로 동작해 읽기 전용으로 선언
struct TimesTable {
    let multiplier: Int

    subscript(index: Int) -> Int {
        return multiplier * index
    }
}

let threeTimesTable = TimesTable(multiplier: 3)

print("six times three is \\(threeTimesTable[6])")
// "six times three is 18" 출력

 

서브스크립트 사용 (Subscript Usage)

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]

numberOfLegs["bird"] = 2

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4, nil: 3]
print(numberOfLegs)
// [Optional("cat"): 4, nil: 3, Optional("spider"): 8, Optional("ant"): 6]

 

서브스크립트 옵션(Subscript Options)

  • 입력 인자의 숫자에 제한이 없음, 입력 인자의 타입과 반환 타입의 제한도 없음
  • 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)
let someValue = matrix[2, 2]
// [2, 2]가 사용할 수 있는 행렬의 범위를 벗어나므로 assert가 실행됩니다.
반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] 초기화  (1) 2024.03.25
[Swift] 상속  (0) 2024.03.22
[Swift] 메서드  (0) 2024.03.21
[Swift] 프로퍼티  (0) 2024.03.20
[Swift] 클래스와 구조체  (0) 2024.03.19

댓글