서브 스크립트(Subscripts)

린다·2022년 2월 25일
0

The Swift Language Guide

목록 보기
6/7
post-thumbnail

아래의 글은 The swift programming languagebbiguduk님, jusung님의 번역본을 보며 공부한 내용입니다.

요약

  • 클래스, 구조체, 열거형에서 서브 스크립트를 별도로 정의하여 사용할 수 있음
  • Collection, List, Sequence 등 특정 member element에 간단하게 접근할 수 있는 문법
    • 추가적인 메소드없이 특정 값을 할당하거나 가져올 수 있음
    • 배열: index, 딕셔너리: key
  • 하나의 타입에 여러 서브 스크립트 정의도 가능하고 Overload도 가능
    • Overload: 동일한 이름으로 타입을 다르게 정의하여 사용하는 것(중복 정의)
    • 매개변수의 타입, 개수가 다르면 이름이 동일한 함수를 여러개 만들 수 있음
    • 전달인자 레이블만 달라도 다른 함수로 인식함
  • 필요하다면 복수 인자값을 사용할 수 도 있음

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

  • Instance Method, Computed Property 선언하는 방식과 비슷함
  • 서브 스크립트는 읽고-쓰기(read-write), 읽기 전용(read only)만 가능함
  • get, set 사용
subscript(index: Int) -> Int {
    get {
        // 적절한 반환 값
    }
    set(newValue) {
        // 적절한 set 액션
    }
}
  • get, set을 따로 지정하지 않으면 읽기 전용으로 인식됨
subscript(index: Int) -> Int {
    // 적절한 반환 값
}

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

var numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
numberOfLegs["bird"] = 2
  • 사전의 서브 스크립트 반환값은 옵셔널. 해당 키가 존재하지 않을수도 있고 값이 nil로 설정될 수도 있기 때문에

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

  • 가능한 것
    • 입력 인자의 숫자 제한 x
    • 입력 인자의 타입과 반환 타입의 제한도 없음
    • 오버로딩(중복 정의) → 인자형, 반환형에 따라 원하는 수 만큼의 서브 스크립트를 선언할 수 있음
  • 불가능한 것
    • in-out parameter, default 값 제공
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(*:*:file:line:) 특정 조건을 체크하고 조건이 성립되지 않으면 메세지를 출력할 수 있음 실제 배포된 앱 성능에는 영향을 끼치지 않는다는 특징이 있음 API 테스트 등 조건 체크 및 테스트를 할 때 유용하게 사용할 수 있음

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

  • 인스턴스 서브 스크립트: 특정 타입의 인스턴스를 호출하는 서브 스크립트
  • 타입 서브 스크립트: 타입 자체에서 호출
  • 키워드 static (subscript 키워드 전에 삽입, class의 경우 하위 클래스가 수퍼 클래스의 서브 스크립트 재정의(오버라이딩)하면 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)

0개의 댓글