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

좋은 웹페이지 즐겨찾기