ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 서브스크립트(subscript)
    iOS/Swift 2022. 8. 20. 23:45

     

    서브스크립트

    • 클래스, 구조체, 열거형 등의 타입의 요소에 접근하는 문법이다
    • 별도의 설정자(setter)와 접근자(getter) 메서드를 구현하지 않아도 인덱스를 통해 값을 설정하거나 가져올 수 있다
    • 서브스크립트 중복정의: 여러 개 구현 O -> 값의 타입을 유추해서 적잘한 서브스크립트를 선택하여 실행한다
    • 매개변수의 타입과 반환 타입에 제한이 없다

     

    ⭐️ subscript 키워드
       - 읽고 쓰기
       - 읽기 전용

     

    서브스크립트 정의 문법

    // 읽고 쓰기
    subscript(index: Int) -> Int {
       get {
       }
    
       set(newValue) {
       }
    }
    
    // 읽기 전용
    subscript(index: Int) -> Int {
    }

     

    예시 코드

    
    // School 클래스 서브스크립트 구현
    
    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? {
            
            //index는 0부터 시작하기 때문에 원소의 개수보다 클 수 없다!
            if index < self.number {
                return self.students[index]
            }
            return nil
        }
    }
    
    // 인스턴스 생성
    let highSchool: School = School()
    
    // 인스턴스 사용
    highSchool.addStudents(names: "Byeongkyu", "Yeonsu", "Star")
    
    let aStudent: Student? = highSchool[1]
    print(aStudent?.number)     //Optional(1)
    print(aStudent?.name)       //Optional("Yeonsu")
    
    Optional("Star")
    print(highSchool[]?.name)   //매개변수 기본값 사용 Optional("Byeongkyu")

     


    타입스크립트

    인스턴스가 아니라 타입 자체에서 사용할 수 있는 서브스크립트이다

    static subscript ~

     

    // ============================================
    // 타입 서브스크립트
    // static 키워드를 통해 구현할 수 있다
    
    enum aSchool: Int {
        case elementary = 1, middle, high, university
        
        static subscript(level: Int) -> aSchool? {
            return aSchool(rawValue: level)
        }
    }
    
    let school: aSchool? = aSchool[2]
    print(school)   //Optional(iOS_study.aSchool.middle)

     

Designed by Tistory.