서브 스크립트

Minseong·2022년 2월 21일
0

swift

목록 보기
5/10

서브 스크립트(Subscripts)

  • 설정과 검색을 위한 별도의 메서드 없이 인덱스로 값을 설정하고 조회하기 위해 서브 스크립트를 사용

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

  • subscript 키워드로 서브 스크립트 정의를 작성하고 인스턴스 메서드와 같은 방법으로 하나 이상의 입력 파라미터와 반환 타입을 작성
  • 인스턴스 메서드와 다르게 서브 스크립트는 읽기-쓰기 또는 읽기전용이 될 수 있다
  • 이러한 동작은 계산된 프로퍼티와 같은 방법으로 gettersetter를 통해 동작
subscript(index: Int) -> Int {
    get {
        // Return an appropriate subscript value here.
    }
    set(newValue) {
        // Perform a suitable setting action here.
    }
}
  • newValue 의 타입은 서브 스크립트의 반환 값과 동일하다.
  • 계산된 프로퍼티와 마찬가지로 setter(newValue) 파라미터를 지정하지 않도록 선택할 수 있다
  • 파라미터를 지정하지 않으면 setternewValue 라는 기본 파라미터가 제공
  • 읽기전용 계산된 프로퍼티와 마찬가지로 get 키워드와 그것의 중괄호를 삭제하여 읽기전용 서브 스크립트를 쉽게 선언할 수 있다
struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("\(threeTimesTable[6])")
// 18

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

  • "서브 스크립트"의 정확한 의미는 사용되는 컨텍스트에 따라 다르다
  • 일반적으로 서브 스크립트는 콜렉션, 목록, 또는 시퀀스에 멤버 요소에 접근하는 바로가기로 사용
  • 특정 클래스 또는 구조체의 기능에 가장 적합한 방식으로 서브 스크립트를 자유롭게 구현할 수 있다
    예를 들어 Swift의 Dictionary 타입은 Dictionary 인스턴스에 저장된 값을 설정하고 조회하기 위해 서브 스크립트를 구현한다. 서브 스크립트 대괄호 내에 딕셔너리의 키 타입의 키를 제공하고 딕셔너리의 값 타입의 값을 서브 스크립트에 할당하여 딕셔너리에 값을 설정할 수 있다
var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2

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

  • 서브 스크립트는 여러개의 입력 파라미터를 가질 수 있고 입력 파라미터는 어떤 타입도 가능하다
  • 서브 스크립트는 어떤 타입도 반환할 수도 있다
  • 함수와 다르게 서브 스크립트는 in-out 파라미터를 사용할 수 없다
  • 여러개의 서브 스크립트 정의를 서브 스크립트 오버로딩 subscript overloading 이라 한다.
  • 대부분 서브 스크립트는 하나의 파라미터를 가지지만 적절한 타입에 경우 여러개의 파라미터를 가진 서브 스크립트를 정의할 수도 있다
    -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)
스크린샷 2022-02-21 오후 5 42 43
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
스크린샷 2022-02-21 오후 5 46 20

타입 서브 스크립트(Type Subscripts)

  • 타입 자체에서 호출되는 서브 스크립트
  • subscript 키워드 전에 static 키워드를 작성하여 타입 서브 스크립트를 구현
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를 참조

profile
안녕하세요! ios 공부 중인 초보 개발자입니다!

0개의 댓글

관련 채용 정보