Swift.Subscript


SWIFTプログラミング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