[Swift] 서브스크립트에 대해 알아보자!

zooneon·2020년 11월 16일
1

Swift 기본 문법

목록 보기
10/14
post-custom-banner

본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.

서브스크립트 - subscript

  • 서브스크립트는 별도의 설정자 또는 접근자 등의 메서드를 구현하지 않아도 인덱스를 통해 값을 설정하거나 가져올 수 있다.
  • 서브스크립트를 여러 개 구현해도 서브스크립트를 사용할 때 전달한 값의 타입을 유추하여 적절한 서브스크립트를 선택하여 실행한다.
  • 여러 서브스크립트를 한 타입에 구현하는 것을 서브스크립트 중복 정의라고 한다.
  • 서브스크립트는 타입에 따라 여러 매개변수를 가질 수 있고, 매개변수의 타입과 반환 타입에는 제한이 없다.

서브스크립트 문법

  • 서브스크립트는 인스턴스의 이름 뒤에 대괄호로 감싼 값을 써줌으로써 인스턴스 내부의 특정 값에 접근할 수 있다.
  • 서브스크립트는 subscript 키워드를 사용하여 정의한다.
  • 서브스크립트를 정의하는 코드는 각 타입의 구현부 또는 타입의 익스텐션 구현부에 위치해야 한다.
subscript(index: Int) -> Int {
	get {
		//서브스크립트 결괏값 반환
	}
	
	set(newValue) {
		//설정자 역할 수행
	}
}

//읽기 전용으로 구현 가능
subscript(index: Int) -> Int {
	//서브스크립트 결괏값 반환
}

서브스크립트 구현

  • 서브스크립트는 자신이 가지는 시퀀스나 컬렉션, 리스트 등의 요소를 반환하고 설정할 때 주로 사용한다.
  • 서브스크립트는 매개변수 기본값을 가질 수 있지만 입출력 매개변수는 가질 수 없다.
struct Student {
    var number: Int
    var name: String
}

class School {
    var number: Int = 0
    var students: [Student] = [Student]()
    
    func addStudent(name: String) {
        let student: Student = Student(number: self.number, name: name)
        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 school: School = School()
school.addStudents(names: "zooneon", "mike", "jhon", "charles")

let student: Student? = school[1]
print("\(student?.name) \(student?.number)")    //Optional("mike") Optional(1)
print(school[]?.name)    //Optional("zooneon")

타입 서브스크립트

  • 타입 서브스크립트는 인스턴스가 아니라 타입 자체에서 사용할 수 있는 서브스크립트이다.
  • 타입 서브스크립트를 구현하기 위해선 subscript 키워드 앞에 static 키워드를 붙여주면 된다.
enum School: Int {
    case elementary = 1, middle, high, university
    
    static subscript(level: Int) -> School? {
        return Self(rawValue: level)
    }
}

let school: School? = School[2]
print(school)    //School.middle
profile
블로그 이전했습니다. https://blog.zooneon.dev
post-custom-banner

0개의 댓글