Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift 공식 문서] 12. Subscripts 본문

swift 공식 문서

[iOS - swift 공식 문서] 12. Subscripts

jake-kim 2021. 7. 3. 22:39

Subscripts

  • 배열에서의 Random Access하기 위해 index값을 사용하는데, 이때 인덱스 값이 'Subscripts'
    • ex) arr[3] = 1
  • swift에서는 class, struct, enum의 []연산자를 subscript 키워드를 통해 정의 가능

swift의 subscript 키워드

  • swift는 subscript를 정의하여 sequence가 아니더라도 특정 연산이 되게끔 가능
struct TimeTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}

let threeTimeTable = TimeTable(multiplier: 3)
print(threeTimeTable[5]) // 15
  • subscript는 computed property
subscript(index: Int) -> Int {
    get {

    }
    set(newValue) {
    
    }
}

Subscript 사용처

  • 일반적으로 sequence의 요소에 접근하기 위해 subscript를 사용하지만, swift에서는 사용에 따라 기능 다른점이 존재
  • Dictionary
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

Subscript 옵션

  • 여러개의 매개 변수 사용 가능
    • arr[1, 2]
  • in-out 사용 불가
  • 매개변수에 default 값 사용 가능

ex) 1차원 배열을 subscript를 이용하여 2차원 배열처럼 사용

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
matrix[1, 0] = 3.2

static subcript

  • static을 생략하면 instance subscript
  • class subscrip도 존재

ex) enum에서 static subscript을 사용하여 접근

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) // mars

* 참고

https://docs.swift.org/swift-book/LanguageGuide/Subscripts.html

Comments