본문 바로가기
Swift

서브스크립트에 관하여

by iOS 개린이 2023. 1. 28.

서브스크립트(Subscript)

-클래스, 구조체, 열거형에서 컬렉션, 리스트, 시퀸스의 등 타입의 요소에 접근하기 위한 바로가기 첨자로 단축 문법이다.

-별도의 getter, setter 메서드를 구현하지 않아도 값을 가져오거나, 값을 설정해줄 수 있다.

 

-해당 인스턴스 이름 뒤에 [ ] 기호로 묶고 안에 값을 넣음으로써 서브스크립트를 사용한다.

 

-Array(배열)안의 원하는 index 값에 접근하고 싶을 때, Array[index]를 통해 값에 접근할 수 있는 것,  

Dictionary(사전)의 key를 통해 값에 접근하고 싶을 때, Dictionary[key]를 통해 값에 접근할 수 있는 표현들이 서브스크립트를 말한다.

 

-단일타입에 여러개의 서브스크립트를 정의할 수 있다.

 

 

Array에서 서브스크립트 사용하기.

let names : [String] = ["철수", "영희", "지호"]

names[0]        //철수
names[1]        //영희
names[2]        //지호

 

위에서 말했듯이 names 라는 배열의 인스턴스 이름 뒤에 [ ] 로 묶고 안에 원하는 값을 설정하여 요소에 접근하는 것이 서브스크립트이다.

 

 

Dictionary에서 서브스크립트 사용하기.

let age : [String : Int] = ["철수" : 10, "영희" : 11, "지호" : 12]

age["철수"]          //10
age["영희"]          //11
age["지호"]          //12

 

배열과 마찬가지로 age라는 인스턴스의 이름 뒤에 [key]를 사용해서 접근하는 것이 서브스크립트.

 

 

 

서브스크립트 정의

-서브스크립트는 subscript 키워드를 사용하여 정의한다.

-인스턴스 메서드와 비슷하게 파라미터의 수, 파라미터의 타입, 리턴 타입 등을 정의할 수 있는데, 파라미터나 리턴형을 생략할 수 없다.

-연산 프로퍼티와 비슷하게 getter/setter 형태로 정의가 가능하지만, set-only 불가하다.(원래 안됨)

 

서브스크립트 정의 문법

subscript(index : Int) -> Int {
   get {
       //get값 반환
       
   }set(newValue){
       //설정한 역할 수행
       
   }
}

 

위의 코드는 서브스크립트의 정의 방식으로, 연산프로퍼티와 비슷하다.

리턴타입과 set의 파라미터인 newValue는 같은 타입이고, 연산프로퍼티와 같이 set의 파라미터(nexValue)를 제거해도 암묵적으로 사용하는 newValue를 사용하는 것이 가능하다.

get-only일 때 get 구문을 생략하는 것도 가능하다.

 

 

 

 

서브스크립트 구현

 

struct Name {
    var name : [String] = ["철수", "영희", "지호", "하림"]
 
    subscript(index: String) -> String {
        get {
            return name[index]
        }
        set {
            name[index] = newValue
        }
    }
}

var name : Name = Name()

name[0]         //철수(get 접근)
name[1]         //영희(get 접근)

name[2] = "지호아님"     //지호아님(set 접근)

 

위와 같이 Name이란 구조체 안에 서브스크립트를 구현하고, 인스턴스를 통해 접근할 수 있다.

 

알다시피 String 타입 값은 배열처럼 서브스크립트로 인덱스에 접근할수 없다.

하지만 서브스크립트를 활용하면 배열처럼 인덱스에 접근이 가능하다.

 

ex)

extension String {
   subscript(idx: Int) -> String? {
        guard (0..<count).contains(idx) else {
            return nil
        }
        let target = index(startIndex, offsetBy: idx)
        return String(self[target])
   }
}

 

String을 extension하고 다음과 같이 서브스크립트를 정의하면

 

let student = "My Name is 지호"
student[0]           // Optional("M")
student[100]         // nil

 

어떤 String이든 [index]로 값에 접근할 수 있다.

 

 

 

타입 서브스크립트

-위에서 설명한 부분들은 모두 인스턴스를 통해 사용하는 서브스크립트였다.

타입 서브스크립트는 인스턴스 없이 "타입 이름"을 통해 서브스크립트를 사용할 수 있도록 해주는 것. 

 

-사용방법은 subscript 키워드 앞에 static이나 class 키워드를 붙여주면 됨.

 

struct Name {
    static var name: [String] = ["철수", "영희", "지호"]
 
    static subscript(index: String) -> String {
        return name[index]
    }
}

Name[0]        //철수
Name[1]        //영희
Name[2]        //지호

 

 

 

Reference

 

-https://babbab2.tistory.com/123

-야곰 스위프트 프로그래밍 3판

 

 

'Swift' 카테고리의 다른 글

Static과 Class에 관하여  (0) 2023.01.31
오버로딩(Overloading)에 관하여  (0) 2023.01.30
오버라이딩(Overriding)에 관하여  (0) 2023.01.26
제네릭(Generic)에 관하여  (0) 2022.11.23
Protocol에 관하여  (0) 2022.11.14