大器晩成

서브 스크립트(Subscripts) 본문

iOS/Swift 문법

서브 스크립트(Subscripts)

zerobugpark 2024. 11. 25. 12:34

 

  • 대괄호를 이용해서 접근가능하도록 만든 문법을 가리킵니다.
  • 배열 - array[인덱스]
  • 딕셔너리 - dictionary[키]
var array = ["Apple", "Swift", "iOS", "Hello"]

array[0]
array[1]
// 내부적으로 대괄호를 사용하면 어떤 값을 리턴하도록 구현이 되어 있어서 가능한 일

// 인스턴스.0
// 인스턴스.method()   =====> 이런 형태가 아닌 
// 인스턴스[파라미터]     =====> 이런 형태로 동작을 가능하게한 문법 (대괄호로 메서드의 기능을 대신)

 

(인스턴스) 서브스크립트(Subscripts)의 직접 구현 - 클래스, 구조체, (열거형)

// 인스턴스 메서드로써의 서브스크립트 구현
subscript(파라미터명: 파라미터 타입) -> 리턴타입 {
    get { return 리턴타입 } 
    set { // 구현하지 않아도 괜찮음 }
}

class SomeData {
    var datas = ["Apple", "Swift", "iOS", "Hello"]

    subscript(index: Int) -> String {     // 1) 함수와 동일한 형태이지만, 이름은 subscript
        get {                             // 2) get/set은 계산속성에서의 형태와 비슷
            return datas[index]
        }
        set(parameterName) {
            datas[index] = parameterName // 또는 파라미터 생략하고 newValue로 대체 가능(계산 속성의 setter와 동일)
        }
    }
    
}

var data = SomeData()
data.datas[0] // 원래 이렇게 접근해야 함
data[0] // 서브스크립트문법을 구현해서 더 쉽게 접근 가능하도록 구현
//data[0] = "AAA"

 

  • subscript는 파라미터는 생략이 불가능합니다.(값이 반드시 필요)
  • subscript는 리턴형도 생략 불가능합니다.(저장할 값의 타입 명시 필요)
  • 읽기 전용(read-only)으로 선언 가능 합니다.(set블록은 선택적으로 구현이 가능하고, 쓰기 전용으로의 선언은 불가)
  • subscript도 오버로딩이 가능합니다.

 

서브스크립트 사용 예시 - 대괄호 형태로 사용하는 메서드입니다.

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

let threeTimesTable = TimesTable()
print("6에 3배를 하면 숫자 \(threeTimesTable[6]) 이(가) 나옵니다.")
threeTimesTable[2] // 6
threeTimesTable[3] // 9

struct Matrix {
    // 2차원 배열
    var data = [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]]
    // 2개의 파라미터를 받는 읽기전용 서브스크립트의 구현
    subscript(row: Int, column: Int) -> String? {
        if row >= 3 || column >= 3 {
            return nil
        }
        return data[row][column]
    }
}
// 2개의 파라미터를 받는 서브스크립트 구현도 가능
var mat = Matrix()
mat[0, 1]!  // 2   // 대괄호 안에 파라미터 2개 필요

// 딕셔너리도 가능
class SomeDictionary {
    var datas = [1:"Apple", 2:"Swift",3:"iOS",4:"Hello"]
    
    subscript(key: Int) -> String {
        get {
            if let data = datas[key] {
                return data
            } else {
                return ""
            }
        }
        set(parameterName) {
            datas[key] = parameterName
        }
    }
}

var data = SomeDictionary()
data.datas[1]
data[1]

 

 

타입 서브스크립트(Type Subscripts) - 클래스, 구조체, (열거형)

enum Planet: Int {   // 열거형의 원시값
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
    
    static subscript(n: Int) -> Planet {    // Self
        return Planet(rawValue: n)!
    }
}

let mars = Planet[4]      // Planet.venus
print(mars)

Planet.venus          //venus
Planet(rawValue: 2)  //venus
Planet.venus.rawValue // 2
Planet[2].rawValue   // 2

// static 또는 class 키워드로 타입 자체의 서브스크립트 구현 가능
// class는 상속시 재정의 가능

 

 

예제 참고

https://bbiguduk.gitbook.io/swift/language-guide-1/subscripts

 

서브 스크립트 (Subscripts) | Swift

콜렉션의 요소에 접근합니다. 클래스, 구조체, 그리고 열거형은 콜렉션, 리스트, 또는 시퀀스의 멤버 요소에 접근할 수 있는 단축키인 서브 스크립트 (subscripts) 를 정의할 수 있습니다. 설정과 검

bbiguduk.gitbook.io

 

728x90

'iOS > Swift 문법' 카테고리의 다른 글

싱글톤패턴 (Singleton Pattern)  (0) 2024.11.25
접근 제어 (Access Control)  (0) 2024.11.25
타입 메서드  (0) 2024.11.25
인스턴스 메서드  (0) 2024.11.25
속성감시자(프로퍼티 옵저버, Property Observer)  (0) 2024.11.25