study record

[Swift] 서브스크립트 본문

Swift/스위프트 프로그래밍

[Swift] 서브스크립트

asong 2021. 12. 26. 21:28

서브스크립트는 별도의 설정자 또는 접근자 등의 메서드를 구현하지 않아도 인덱스를 통해 값을 설정하거나 가져올 수 있다. 예를 들어 someArray라는 Array 인스턴스의 인덱스를 통해 해당 인덱스의 값에 접근하고 싶다면 someArray[index]라고 표현하는 것이 서브스크립트이다.

서브스크립트를 여러 개 구현해도 외부에서 서브스크립트를 사용할 때는 서브스크립트를 사용할 때 전달한 값의 타입을 유추하여 적절한 서브스크립트를 선택하여 실행한다. 이렇게 여러 서브스크립트를 한 타입에 구현하는 것을 서브스크립트 중복 정의라고 한다.

서브스크립트는 통상 하나의 매개변수를 갖는 것이 보통이지만 타입에 따라 여러 매개변수를 가지는 경우도 있다. 매개변수의 타입과 반환 타입에는 제한이 없다. 함수와 마찬가지로 서브스크립트는 여러 개의 매개변수를 가질 수 있고, 매개변수 기본값을 가질 수 있다. 그렇지만 입출력 매개변수는 가질 수 없다.

서브스크립트 문법

서브스크립트는 인스턴스의 이름 뒤에 대괄호로 감싼 값을 써줌으로써 인스턴스 내부의 특정 값에 접근할 수 있다. 서브스크립트 문법은 연산 프로퍼티나 인스턴스 메서드 문법과 유사한 형태로 볼 수 있다.

서브스크립트는 subscript 키워드를 사용하여 정의한다. 인스턴스 메서드와 비슷하게 매개변수의 개수, 타입, 반환타입 등을 지정하며, 읽고 쓰기가 가능하도록 구현하거나 읽기 전용으로만 구현할 수 있다. 이는 접근자와 설정자를 사용할 수 있는 연산 프로퍼티의 형태와 유사하다.

// 서브스크립트 정의 문법
subscript(index: Int) -> Int {
	get {
	
	}

set(newValue) {

	}
}

서브스크립트 설정자의 newValue의 타입은 서브스크립트의 반환 타입과 동일하다. 연산 프로퍼티와 마찬가지로 매개변수를 따로 명시해주지 않으면 설정자의 암시적 전달인자 newValue를 사용할 수 있다 .또 연산 프로퍼티와 마찬가지로 읽기 전용 프로퍼티를 구현할 때는 get이나 set 키워드를 사용하지 않고 적절한 값만 반환해주는 형태로 구현해도 된다.

// 읽기 전용 서브스크립트 정의 문법
subscript(index: Int) -> Int {
	get {
		// 적절한 서브스크립트 값 반환
	}
}

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? {
		if index < self.number {
			return self.students[index]
		}
		return nil
	}
}

let highSchool: School = School()
highSchool.addStudents(names: "minji","jihoo", "jandi")

let aStudent: Student? = highSchool[1]
print("\(aStudent?.number) \(aStudent?.name)")
print((highSchool[]?.name) // 매개변수 기본 값 사용

 

School 클래스는 읽기 전용 서브스크립트가 하나 있다. 학생의 번호를 전달인자로 전달받아 자신의 students 프로퍼티의 인덱스에 맞는 Student 인스턴스를 반환한다.

타입 서브스크립트

이전까지의 서브스크립트는 인스턴스에서 사용할 수 있는 서브스크립트이다. 타입 서브스크립트는 인스턴스가 아니라 타입 자체에서 사용할 수 있는 서브스크립트이다. 타입 서브스크립트를 구현하려면 서브스크립트를 정의할 때 subscropt 키워드 앞에 static 키워드를 붙여주면 된다. 클래스의 경우에는 class 키워드를 사용할 수 있다.

'Swift > 스위프트 프로그래밍' 카테고리의 다른 글

[Swift] 타입 캐스팅  (0) 2022.01.06
[Swift] 상속  (0) 2021.12.27
[Swift] 모나드  (0) 2021.12.06
[Swift] 맵, 필터, 리듀스  (0) 2021.12.03
[Swift] 옵셔널 체이닝과 빠른 종료  (0) 2021.12.02