티스토리 뷰
[시작]
- 클래스, 구조체, 열거형에는 컬렉션, 리스트, 시퀀스 등 타입의 요소에 접근하는 단축 문법인 서브스크립트를 정의할 수 있음
- 별도의 설정자, 접근자를 정의하지 않아도 인덱스를 통해 값을 설정하거나 가져올 수 있음
- 배열, 딕셔너리에서 array[index], dictionary[key]와 같이 표현하는 것
- 한 타입에 여러 개의 서브스크립트 정의 가능
- 다른 타입을 인덱스로 갖는 여러 개의 서브스크립트 중복 정의 가능
[서브스크립트 문법]
- 인스턴스의 이름 뒤에 대괄호로 감싼 값을 써줌으로써 인스턴스 내부의 특정 값에 접근할 수 있음
- subscript 키워드를 사용하여 정의
: 매개변수의 개수, 타입, 반환 타입 등을 지정
: 읽기전용 / 읽기쓰기 전용으로 구현 가능
- 타입의 구현부 또는 타입의 익스텐션 구현부에 서브스크립트 정의 코드가 위치함
1 2 3 4 5 6 7 8 9 | subscript(index: Int) -> Int{ get{ //적절한 서브스크립트 결과값 반환 } set(newValue){ //적절한 설정자 역할 수행 } } | cs |
읽기 전용 서브스크립트를 정의할 때는 get, set 키워드가 필요 없음
- 연산 프로퍼티의 문법과 유사함
[서브스크립트 구현]
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 | 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) -> Student?{ if(index<self.number){ return self.students[index] } return nil } } let highSchool = School() highSchool.addStudents(names: "1", "2", "3", "4", "5") let student = highSchool[2] print(student?.name, student?.number) | cs |
School 타입에서 정의된 서브스크립트는 students 배열의 요소를 반환하도록 되어 있고
아래에서 School 타입의 인스턴스에 서브스크립트 문법을 적용함
[복수 서브스크립트]
- 하나의 타입이 여러 개의 서브스크립트를 가질 수 있음
: 다양한 매개변수 타입을 활용
[마무리]
- 서브스크립트는 메서드인듯 아닌듯, 연산 프로퍼티인듯 아닌듯 중간 형태를 가지고 있음
- 인스턴스의 이름 뒤에 대괄호만 써서 편리하게 내부 값에 접근하고 설정해줄 수 있음
- 다양한 목적으로 구현해주는 데 용이함
'Swift > 야곰의 스위프트' 카테고리의 다른 글
19장 타입캐스팅 (0) | 2018.03.01 |
---|---|
18장 상속 (0) | 2018.02.28 |
16장 모나드 (0) | 2018.02.12 |
15장 맵, 필터, 리듀스 (0) | 2018.02.12 |
14장 옵셔널 체이닝과 빠른 종료 (0) | 2018.02.12 |