이번 글은 서브스크립트에 대해 작성해보겠다. 지금까지 공부했던 것 중에 뭔가 가장 애매모호했던,,? 느낌이었다.
서브스크립트
클래스, 구조체, 열거형에는 컬렉션, 리스트, 시퀀스 등 타입의 요소에 접근하는 단축 문법인 서브스크립트를 정의할 수 있다.
타입의 요소란 쉽게 말해서 대괄호로 감싼 인덱스와 같은 개념으로 생각하면 될 것 같다.
인스턴스의 이름 뒤에 대괄호로 감싼 값을 통해 접근할 수 있다
--> 인덱스처럼(인덱스에) 접근이 가능함!
subscript 키워드를 통해 정의
연산 프로퍼티나 인스턴스 메소드 문법과 유사
정의하는 코드는 각 타입의 구현부 또는 타입의 익스텐션 구현부에 위치함
별도의 설정자(setter) 또는 접근자(getter) 등을 구현하지 않아도 인덱스를 통해 값을 설정하거나 가져올 수 있음 (대괄호)
ex. someArray의 index를 통해 해당 인덱스의 값에 접근하고 싶을 때
—> someArray[index] : 이렇게 표현하는 것이 서브스크립트임
subscript(index: Int) -> Int {
get {
//서브스크립트 결괏값 반환
}
set(newValue) {
//설정자 역할 수행
}
}
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \\(threeTimesTable[6])")
// six times three is 18
// 인덱스 값을 이용하여 계산을 진행하였다. (인덱스를 사용)
struct Student {
var name: String
var number: Int
}
class School {
var number: Int = 0
var students: [Student] = [Student]()
func addStudent(name: String) {
let student: Student = Student(name: name, number: self.number)
self.students.append(student)
self.number += 1
}
func addStudents(names: String...) { //들어올 매개변수의 개수가 불확실할 때 ... 사용
for name in names {
self.addStudent(name: name)
}
}
subscript(index: Int = 0) -> Student? { //서브스크립트를 정의하면 인덱스처럼 사용할 수 있게 됨
if index < self.number {
return self.students[index]
}
return nil
}
}
let highSchool: School = School()
highSchool.addStudents(names: "Ted", "DY", "JJ", "JW")
let aStudent: Student? = highSchool[1] //구조체 형식이기 때문에 인덱스를 달아주지 않는 이상 값을 추출할 수 없음
//서브스크립트를 통해 인덱스를 지정해주어 값을 할당 받을 수 있게 됨!
print("\(aStudent?.number) \(aStudent?.name)") //Optional(1) Optional("DY")
print(highSchool[]?.name) //매개변수 기본값 사용 -> Optional("Ted")
사용 예시
let ted = "Hi, Ted!"
ted[0] //error!! (해당 서브스크립트를 사용할 수 없음)
extension String { //문자열을 인덱스로 추출할 수 있는 서브스크립트
subscript(idx: Int) -> String? {
guard (0..<count).contains(idx) else {
return nil
}
let target = index(startIndex, offsetBy: idx)
return String(self[target])
}
}
ted[0] //Optional("H")
그래도 계속 보니깐 어느 정도는 이해가 되는데,, 익숙해지고 활용하기 위해서는 더욱 많이 봐야 할 것 같다.
[출처] 스위프트 프로그래밍 (야곰), 야곰의 스위프트 기초문법 강좌, 개발하는 정대리 스위프트 강좌