Swift.Subscript
스위프트 프로그래밍 3판을 보고 정리한 내용입니다.
서브 스크립트 문법
서브스크립트는 인스턴스의 이름 뒤에 대괄호로 감싼 값을 써줌으로써 인스턴스 내부의 특정 값에 접근할 수 있다.
서브스크립트 문법은 연산 프로퍼티나 인스턴스 메서드 문법과 유사한 형태로 볼 수 있다.
subscript 키워드를 사용하여 정의한다.
subscript(index:Int) -> Int{
get{
//적절한 서브스크립트 결괏값 반환
}
set(newValue){
//적절한 설정자 역할 수행
}
}
서브 스크립트 구현 예제
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: "MiJeong","JuHyen","JunSeok","JiYong","MoonDo")
let aStudent:Student? = highSchool[1]
print("\(aStudent?.name) \(aStudent?.number)") // ptional("JuHyen") Optional(1)
print(highSchool[]?.name) // Optional("MiJeong") 매개변수 기본값 사용
확장된 서브스크립트
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?{
get{
if index < self.number{
return self.students[index]
}
return nil
}
set{
guard var newStudent:Student = newValue else{
return
}
var number:Int = index
if index > self.number{
number = self.number
self.number += 1
}
newStudent.number = number
self.students[number] = newStudent
}
}
//두번째 서브스크립트
subscript(name:String) -> Int?{
get{
return self.students.filter{$0.name == name}.first?.number
}
set{
guard var number:Int = newValue else{
return
}
if number > self.number{
number = self.number
self.number += 1
}
let newStudent:Student = Student(name: name, number: number)
self.students[number] = newStudent
}
}
//세번째 스크립트
subscript(name:String, number:Int) -> Student?{
return self.students.filter{$0.name == name && $0.number == number}.first
}
}
let highSchool:School = School()
highSchool.addStudents(names: "MiJeong","JuHyen","JunSeok","JiYong","MoonDo")
let aStudent:Student? = highSchool[1]
print("\(aStudent?.name) \(aStudent?.number)") // Optional("JuHyen") Optional(1)
print(highSchool["MiJeong"]) //Optional(0)
print(highSchool["JunSeok"]) //Optional(2)
highSchool[0] = Student(name: "HongHui", number: 0)
highSchool["Mangu"] = 1
print(highSchool["JuHyen"]) //nil 원래 number = 1에 있던 JuHyen이 위의 highSchool["Mangu"] = 1 로 인해 Mangu 가 1로 바뀌었다.
print(highSchool["JiYong",3]) //Optional(Student(name: "JiYong", number: 3))
print(highSchool["Heeju",3]) // nil
타입 스크립트
이전까지 서브스크립트는 인스턴스에서 사용할 수 있는 서브스크립트이다.
타입 서브스크립트는 인스턴스가 아니라 타입 자체에서 사용할 수 있는 서브스크립트이다.
substrict 키워드 앞에 static 키워드를 붙여주면 된다.
클래스의 경우에는 class 키워드를 사용할 수도 있다.
enum School:Int{
case elementary = 1, middle, high, university
static subscript(level:Int) -> School?{
return Self(rawValue: level) // return School(rauValue: Level) 과 같은 표현
}
}
let school: School? = School[2]
print(school) // School.middle
Author And Source
이 문제에 관하여(Swift.Subscript), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@junstone1995/Swift.Subscript저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)