Классы, структуры и перечисления могут определять сабскрипты (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]
}
}📌 Лучшие вакансии для мобильных разработчиков
🐸 Библиотека мобильного разработчика
#буст #JuniorKit #Swift