728x90
반응형
안녕하세요 🐶
빈 지식 채우기의 비니🙋🏻♂️ 입니다.
오늘은 서브스크립트 ( Subscript ) 에 대해 알아보는 시간을 가지겠습니다.
1. 개요
클래스, 구조체, 열거형에서의 멤버 요소에 접근하기 위한 바로가기 첨자
아니 이게 무슨 댕댕소리야..?
사실 저희는 개인 및 직장 프로젝트를 진행하면서 서브스크립트는 아주 자연스럽게 사용하고 있습니다 ㅎㅎ
다음 간단한 예로 확인해보도록 하겠습니다.
1-1. Array
let testArr = [1, 2, 3, 4, 5]
print(testArr[0]) // 1
print(testArr[4]) // 5
이렇게 [ ] 대괄호 안에 index를 넣어줘서 멤버 요소에 접근하는 것을 서브스크립트라고 할 수 있습니다.
실제로 배열의 [ ] 따라가보면 아래와 같이 정의되어 있습니다.
- 배열의 서브스크립트는 매개변수로 Int 형의 index를 받는다.
- 해당 index에 해당하는 Element를 반환한다.
1-2. Dictionary
let testDic = ["one" : 1, "two" : 2]
print(testDic["one"]) // 1
print(testDic["two"]) // 2
이렇게 [] 대괄호 안에 key를 넣어줘서 value에 접근하는 것을 서브스크립트라고 할 수 있습니다.
실제로 배열의 [] 따라가보면 아래와 같이 정의되어 있습니다.
- 딕셔너리의 서브스크립트는 매개변수로 Key를 받는다.
- 해당 Key에 해당하는 Value를 반환한다.
간단히, Array와 Dictionary를 통해 서브스크립트가 무엇인지 확인해보았습니다.
그럼 서브스크립트를 직접 사용하는 법에 대해 알아보겠습니다.
2. 서브스크립트 정의
1. subscript 키워드로 작성하며 하나 이상의 파라미터와 반환 값을 지정한다.
2. getter와 setter 모두 구현할 수 있다.
3. get-only는 가능하나, set-only는 불가하다
subscript(index: Int) -> Int {
get {}
set(newValue) {}
}
- getter / setter 성질을 보아하니 연산 프로퍼티와 비슷하다.
- setter의 경우 파라미터 생략 시 newValue로 접근이 가능하다.
- get-only의 경우, get 구문 생략이 가능하다.
2-1. 서브스크립트 사용법
예를 들어, 개발을 하다보면 String도 배열처럼 [ ]의 index로 접근하면 좋겠다~
라는 생각을 아래와 같이 해본 적이 있을 것이다.
let beanii = "Hello, Beanii"
print(beanii[0]) // error 발생
- String의 경우 Int의 index를 사용하여 멤버 요소로 접근하는 서브스크립트 구문이 없다.
- 고로! String Extension을 통해 개발자가 직접 작성을 해야한다.
extension String {
subscript(idx: Int) -> String? {
guard (0..<count).contains(idx) else {
return nil
}
let target = index(startIndex, offsetBy: idx)
return String(self[target])
}
}
- 위와 같이 Extension을 통해 서브스크립트를 구현을 해보았다.
let beanii = "Hello, Beanii"
print(beanii[0]) // Optional("H")
- 이제 String[index] 를 통해 접근이 가능하다.
3. 타입 서브스크립트
타입 프로퍼티 / 타입 메서드 처럼 서브스크립트 또한 타입 서브스크립트로 선언이 가능하다.
struct Stack {
static var stack: [Int] = [0, 1, 2, 3]
static subscript(index: Int) -> Int {
return stack[index]
}
}
print(Stack[0]) // 0
print(Stack[1]) // 1
- 실제로, Stack의 인스턴스 생성 없이 [ ] 와 index 접근을 통해 값을 가지고 올 수 있습니다.
이상으로 서브스크립트 ( Subscript ) 포스팅을 마치겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~
참고
728x90
반응형
'iOS 🖥️ > Swift' 카테고리의 다른 글
[ Swift ] 제네릭 ( Generic ) (0) | 2023.01.10 |
---|---|
[ Swift ] KVC(Key-Value-Coding), KVO(Key-Value-Observing) (0) | 2023.01.05 |
[ Swift ] ARC (2) Retain Cycle, 강한참조, 약한참조 그리고 미소유참조 (0) | 2022.12.29 |
[ Swift ] ARC (1) 기본 개념, Reference Count 이해 (0) | 2022.12.28 |
[ Swift ] COW ( Copy-On-Write ) (0) | 2022.12.27 |