소소한개발팁
article thumbnail
반응형

Subscripts

- 클래스, 구조체 그리고 열거형에서 스크립트를 정의해 사용할 수 있습니다. 서브 스크립트란 컬렉션, 리스트, 시퀀스 등 집합의 특정 멤버 엘리먼트에 간단하게 접근할 수 있는 문법입니다. 서브 스크립트를 이용하면 추가적인 메서드 없이 특정 값을 할당하거나 가져올 수 있습니다. 예를 들면, 배열(Array) 인스턴스의 특정 엘리먼트는 someArray[index]someArray [index] 문법으로, Dictionary 인스턴스의 특정 엘리먼트는 someDictionary[key]someDictionary [key]로 접근할 수 있습니다. 하나의 타입에 여러 서브 스크립트를 정의할 수 있고 오버로드도 가능합니다. 뿐만 아니라 단일 인자 값을 넘어, 필요 따라 복수 인자 값을 사용할 수 있습니다.

 

Subscripts Syntax 

- 서브스크립트 선언 문법은 인스턴스 메서드와 계산된 프로퍼티를 선언하는 것과 비슷합니다. 인스턴스 메서드와 다른 점은, 서브 스크립트는 read-write 또는 read only 만 가능하다는 것입니다. 정의는 계산된 프로퍼티 방식과 같이 setter, getter 방식을 따릅니다.

 

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

 

- 서브스크립트의 set에 대한 인자 값을 따로 지정하지 않으면 기본 값으로 newValue를 사용합니다. 읽기 전용으로 선언하려면 get, set을 지우고 따로 지정하지 않으면 get으로 동작하게 되서 읽기 전용으로 선언됩니다.

 

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

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)

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

 

 

Subscript Usage 

 

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

 

- numberOfLegs값은 타입 추론에 의해 [String: Int] 형을 갖습니다.

 

- numberOfLegs["bird"] = 2는 사전형 변수 numberOfLegs에 key로 bird를 그 값은 2를 넣으라는 서브 스크립트 문법입니다.

 

 

Subscript Options

- 서브스크립트는 입력 인자의 숫자에 제한이 없고, 입력 인자의 타입과 반환 타입의 제한도 없습니다.

 

- in-out parameter 나 default parameter value을 제공할 수는 없습니다.

 

- 서브스크립트는 오버 로딩도 허용합니다.

 

- 인자형, 반환형에 따라 원하는 수만큼의 서브 스크립트를 선언할 수 있습니다. 

 

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
        }
    }
}

 

- 위 코드에서는 subscript(row: Int, column: Int) -> Double코드와 같이 row, column 2개의 인자를 받고, Double를 반환하는 서브 스크립트를 선언했습니다.

 

- get, set 각각에 indexIsValid 메소드를 사용해서 유효한 인덱스가 아닌 경우 프로그램이 바로 종료되도록 assert assert를 호출했습니다. 선언한 서브 스크립트 문법을 이용해 var matrix = Matrix(rows: 2, columns: 2) 2 x 2 행렬을 선언했습니다.

 

 

- grid 배열은 서브스크립트에 의해 위와 같이 row와 column을 갖는 행렬도 동작합니다. 행렬에 서브 스크립트를 이용해 특정 row 및 column 값을 지정할 수 있습니다.

 

matrix[0, 1] = 1.5
matrix[1, 0] = 3.2

 

 

- 행렬의 입출력시 row/column의 범위가 적절한지 아래의 코드로 확인합니다.

 

func indexIsValid(row: Int, column: Int) -> Bool {
    return row >= 0 && row < rows && column >= 0 && column < columns
}

 

- 적절한 범위를 벗어나면 assert 가 실행됩니다.

let someValue = matrix[2, 2]
// This triggers an assert, because [2, 2] is outside of the matrix bounds.

 

 

내용은 https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html 를 보면서 작성하였고 원문으로 작성된 내용을 옮기다 보니 이상한 부분이 있을 수 있습니다. 자세한 내용은 위의 링크를 확인해주시기 바랍니다.

반응형
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!