Сабскрипты

Последнее обновление: 02.01.2018

Классы, структуры и перечисления могут определять сабскрипты (subscripts). Сабскрипты используются для доступа к элементам коллекции или последовательности. В ряде языков программирования есть похожая концепция - индексаторы. Сабскрипты позволяют обращаться с объектом класса или структуры как с отдельной коллекцией.

Для определения сабскрипта используется ключевое слово subscript:

subscript(параметры) -> тип_возвращаемых_объектов {
    
	get {
        
		// возвращаем значение
    }
    set(newValue) {
        
		// устанавливаем новое значение newValue
    }
}

После ключевого слова subscript в скобках идут параметры, которые используются для получения элементов. Нередко параметры представляют числовой индекс, по которому надо получить объект. Далее указывается тип элементов, с которыми мы работаем.

Сабскрипт может состоять из двух блоков: get и set. Блок get возвращает элемент, а блок set устанавливает новое значение, которое передается через параметр newValue.

Например, создадим класс библиотеки. Упрощенно библиотека представляет некоторый набор книг. То есть мы можем представить класс библиотеки как коллекцию книг и использовать сабскрипты для получения книг по индексу:

class Book{		// класс книги 
	
	var name: String
	init(name: String){
		
		self.name = name
	}
}
class Library{		// класс библиотеки
	
	var books: [Book] = [Book]()
	
	init(){
		
		books.append(Book(name: "Война и мир"))
		books.append(Book(name: "Отцы и дети"))
		books.append(Book(name: "Чайка"))
	}
	
	subscript(index: Int) -> Book{
		
		get{
			return books[index]
		}
		set(newValue){
			books[index] = newValue
		}
	}
}

var myLibrary: Library = Library()
var firstBook: Book = myLibrary[0]	// получаем элемент по индексу 0
print(firstBook.name)	// Война и мир

myLibrary[2] = Book(name: "Мартин Иден")	// установка элемента по индексу 2
print(myLibrary[2].name)	// Мартин Иден

Здесь сабскрипт предназначен для работы с типом Book. В блоке get происходит получение объекта Book по индексу из массива books. В блоке set устанавливаем объект Book в массиве books.

В итоге в программе мы сможем обращаться к библиотеке как к массиву по индексу для получения нужной книги:

var firstBook: Book = myLibrary[0]

Есть два типа сабскриптов:

  • Сабскрипты, которые поддерживают чтение и запись (то есть с блоками get и set, как в примере выше)

  • Сабскрипты только для чтения (только с блоком get)

Изменим класс библиотеки, чтобы применить сабскрипт только для чтения:

class Library{
	
	var books: [Book] = [Book]()
	
	init(){
		
		books.append(Book(name: "Война и мир"))
		books.append(Book(name: "Отцы и дети"))
		books.append(Book(name: "Чайка"))
	}
	
	subscript(index: Int) -> Book{
		
		return books[index]
	}
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850