서브스크립트(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 |