Swift 5.1 Static and class subscripts (SE-0254)

Swift 5.1에서는 static 및 class subscript가 도입되어 클래스 및 구조체에서 

서브스크립트(Subscript)를 정의할 때 유용하게 사용될 수 있습니다.

서브스크립트는 인덱스를 사용하여 컬렉션, 리스트, 배열 등의 요소에 액세스하는 기능입니다. 

일반적으로 서브스크립트는 인스턴스 레벨에서 정의됩니다. 

하지만 Swift 5.1에서는 static 및 class 서브스크립트를 정의할 수 있게 되었습니다.

Static subscript
static subscript는 클래스나 구조체의 타입 자체에서 사용할 수 있는 서브스크립트입니다.

즉, 인스턴스 없이 타입 자체에서 호출할 수 있습니다. static subscript는 static 키워드를 사용하여 정의합니다.

struct TimesTable {
    static subscript(n: Int) -> TimesTable {
        return TimesTable(multiplier: n)
    }
    
    let multiplier: Int
    func printTable() {
        for i in 1...10 {
            print("\(multiplier) x \(i) = \(multiplier * i)")
        }
    }
}

let threeTimesTable = TimesTable[3]
threeTimesTable.printTable()

위의 코드는 TimesTable 구조체에서 static subscript를 정의하고 있습니다. 

이 static subscript는 TimesTable 구조체의 인스턴스를 생성하는 데 사용됩니다. 

위 예제에서는 TimesTable 구조체의 인스턴스를 생성할 때 TimesTable[3]과 같은 방식으로 호출합니다. 

이 호출은 TimesTable 구조체의 타입 자체에서 수행됩니다.

Class subscript
class subscript는 클래스의 타입 자체에서 호출될 수 있는 서브스크립트입니다. 

static subscript와 마찬가지로, 인스턴스 없이 타입 자체에서 호출할 수 있습니다. 

class subscript는 class 키워드를 사용하여 정의합니다.

class SomeClass {
    static var count = 0
    class subscript(index: Int) -> Int {
        get {
            return index + count
        }
        set(newValue) {
            count = newValue - index
        }
    }
}

print(SomeClass[10])  // 10
SomeClass[10] = 20
print(SomeClass[10])  // 20

위의 코드는 SomeClass 클래스에서 class subscript를 정의하고 있습니다. 

이 class subscript는 SomeClass 클래스의 인스턴스를 생성하지 않고 클래스 자체에서 사용됩니다. 

위 예제에서는 SomeClass 클래스의 인스턴스를 생성하지 않고 SomeClass[10]과 같은 방식으로 호출합니다.

결론적으로, Swift 5.1에서는 static 및 class subscript가 도입되어 클래스 및 구조체에서 

서브스크립트를 더욱 편리하게 정의할 수 있게 되었습니다. 

이를 통해 타입 자체에서 요소에 액세스할 수 있으므로 보다 유연한 코드 작성이 가능합니다.

 

감사합니다.