서브스크립트(Subscript)에 대해 알아 보겠습니다.
서브스크립트
서브스크립트는 Class, Struct, Enum에서 콜렉션, 순열, 리스트 등의 멤버 요소에 쉽게 접근하기 위한 방법입니다.
인스턴스의 이름 뒤에 대괄호로 감싼 값을 써줌으로써 인스턴스 내부의 특정 값에 접근할 수 있습니다.
설정자(Setter)와 접근자(Getter)메서드를 구성하지 않고도 인덱스를 통해 어떤 값을 빠르게 설정하거나 가져올 수 있습니다.
예를들어 arr이라는 Array 인스턴스의 index를 통해 해당 인덱스의 값에 접근하고 싶다면 arr[index]라고 표현해서 쓴것들이 서브스크립트 입니다.
Subscript Syntax
subscript키워드 사용.
서브스크립트를 구현하는 코드는 각 타입의 구현부 또는 타입의 익스텐션 구현부에 위치해야합니다.
subscript(index: Int) -> Int {
get {
// 서브스크립트 결괏값 반환
}
set(newValue) {
// 설정자 코드
}
}
// get, set 키워드를 사용하지 않고 적절한 값만 반환해주는 형태로 구현해도 됩니다.
subscript(index: Int) -> Int {
// 적절한 서브스크립트 결괏값 반환
}
사용법 예제
예제를 이용해서 알아 보도록 하겠습니다.
1. 첫번째
struct TimeTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
//six times three is 18
let threeTimesTable = TimesTable(multiplier: 3)
//five times seven is 35
print("six times three is \(threeTimesTable[6])")
2. 두번째
struct Student {
var name: String
var number: Int
}
class School {
var number: Int = 0
var student: [Student] = [Student]()
func addStudent(name: String) {
let student: Student = Student(name: name, number: self.number)
self.student.append(student)
self.number += 1
}
subscript(index: Int) -> Student? {
guard index < self.number else { return nil }
return self.student[index]
}
}
let middleSchool: School = School()
middleSchool.addStudent(name: "김승진")
middleSchool.addStudent(name: "김땡댕")
middleSchool.addStudent(name: "홍길동")
//서브스크립트(첨자)로 접근 가능
print(middleSchool[0]!) // Student(name: "김승진", number: 0)
print(middleSchool[1]!.name) // 김땡땡
print(middleSchool[2]!) // Student(name: "홍길동", number: 2)
3. 세번째 (Extension 활용)
extension String {
// 1. 자연수를 입력 받아 해당 인덱스에 위치한 문자(Character)를 반환하는 Subscript 구현
// str[0] - "H", str[5] - ","
subscript(intIndex: Int) -> Character {
if intIndex >= 0 {
return self[self.index(startIndex, offsetBy: intIndex)]
} else {
return self[self.index(startIndex, offsetBy: count + intIndex)]
}
}
// 2. IntRange ( ..< ) 를 입력받아 해당 범위의 문자열(String)을 반환하는 Subscript 구현
// str[0 ..< 2] - "He", str[2 ..< 6] - "llo,"
subscript(intRange: Range<Int>) -> String {
return String(self[index(startIndex, offsetBy: intRange.lowerBound)..<index(startIndex, offsetBy: intRange.upperBound)])
}
}
let str = "Hello, World!"
str[0] // "H"
str[5] // ","
str[0..<2] // "He"
str[2..<6] // "llo,"
'Swift' 카테고리의 다른 글
[Swift] 프로토콜 지향 프로그래밍(Protocol-Oriented Programming) (0) | 2019.07.24 |
---|---|
[Swift] Magnitude, Abs (0) | 2019.07.24 |
[Swift] Error Handling (0) | 2019.07.24 |
[Swift] 타입캐스팅(Type Casting) (0) | 2019.07.22 |
[Swift] 타입체크(TypeCheck) (0) | 2019.07.22 |