Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

[Swift] Subscripts 본문

iOS/문법

[Swift] Subscripts

김먐 2024. 4. 1. 01:01

우리가 collection의 요소에 접근하려 할 때 사용하는 subscript

ex. arr[index]로 array의 요소에 접근하기, dic[key]로 dic의 요소에 접근하기

 

 

우리는 이런 subscript를 직접 만들어

사용자 타입의 인스턴스의 요소에 접근할 수 있도록 할 수 있다!

 

subscript

  • subscript 키워드로 subscript를 정의한다.
  • 하나 이상의 입력 파라미터와 return 타입 작성해 주기
  • read-write, read-only 둘다 가능
subscript(index: Int) -> Int {
    get {
        // Return an appropriate subscript value here.
    }
    set(newValue) {
        // Perform a suitable setting action here.
    }
}
  • get
    • 적절한 return value 작성
  • set
    • newValue 를 활용한 계산 수행

 

 

example

구구단을 나타내는 구조체 TimesTable을 만들어보자.

struct TimesTable {
    let multiplier: Int

    subscript(index: Int) -> Int {
        return multiplier * index
    }
}

정의한 subscript 구문에서는

구조체 프로퍼티 multiplier와 index 파라미터의 값의 곱을 return하도록 했다.

 

 

let threeTimesTable = TimesTable(multiplier: 3)
print(threeTimesTable[0]) // 0
print(threeTimesTable[1]) // 3
print(threeTimesTable[2]) // 6
print(threeTimesTable[6]) // 18

구조체 인스턴스를 만들어 multiplier로 3을 넣었다.

 

threeTimesTable의

0번째 요소에 접근하면 3*0 = 0

1번째 요소에 접근하면 3*1 = 3

2번째 요소에 접근하면 3*2 = 6

6번째 요소에 접근하면 3*6 = 18

 

이처럼 subscript 구문을 사용해서 우리가 직접 만든 타입 인스턴스의 요소에 접근할 수 있다.

 

 

subscript options

  • subscript는 여러 입력 파라미터를 가질 수 있고, 어떤 타입도 반환할 수 있음
  • 가변 파라미터 가능
  • 파라미터에 기본값 설정 가능
  • in-out 파라미터 불가능

 

subscript overloading

파라미터와 리턴 타입을 다양하게 작성하여 여러 개의 subscript 구문을 정의할 수 있음

의도에 맞게 subscript 구문을 정의하고 접근하면 된다.

struct Point {
    var x: Int
    var y: Int

    subscript(coordinate: String) -> Int {
        return coordinate == "x" ? x : y
    }

    subscript(index: Int) -> Int {
        return index == 0 ? x : y
    }
}

var point = Point(x: 3, y: 5)
print(point["x"]) // 3
print(point[0]) // 3
  • “x”, 0 둘다로 x 값에 접근할 수 있다
    • 당히… 요시꼬리한 코드이지만 만들 수 있는 예제가 생각이 안 난다 ㅠ

 

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) // mars
  • 하위 클래스에서 재정의하고 싶게 하고 싶다면, static 대신 class 키워드 사용하기

 

 

정리 - Subscript

collection의 요소에 접근할 때 사용되는데, subscript로 직접 커스텀하여 우리가 만든 사용자 타입의 요소들에도 접근하게 할 수 있다.

 


Reference

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

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

[Swift] 캡처, 캡처리스트  (0) 2024.04.01
[Swift] Swift의 클로저  (0) 2024.04.01
[Swift] escaping closure  (0) 2024.04.01
[Swift] 상속  (0) 2024.04.01
[Swift] Swift의 Class  (0) 2024.04.01