- •Объявление, инициализация и изменение значения. Виды операторов. Переменные и константы. Виды объектов.
- •Типы данных
- •4. Числовые типы данных. Арифметические операторы. Приведение числовых типов данных.
- •5. Текстовые типы данных. Инициализация строковых значений. Приведение к строковому типу данных. Объединение строк.
- •6. Логические значения. Логические операторы.
- •Как проверить, есть ли значение в переменной с опциональным типом данных?
- •12* Операторветвления switch. Fallthrough. Where.
- •13.Сұрақ. Кортежи в операторе switch
- •Наборы: объявление набора, создание пустого набора, доступ к набору и модификация набора.
- •Оператор while
- •Оператор repeatwhile
- •24 Функции: объявление, синтаксис вызова функции. Примеры.
- •Заметка
- •25.Входные аргументы и возвращаемое значение
- •Глава 15 • Функции 245
- •26 Функция в качестве входного аргумента
- •27.Кортеж в качестве возвращаемого значения
- •28. Функционалдымүмкіндіктер. Функционалдытүрі. Функция аргумент ретінде.
- •29. Күрделіфункционалды тип. Қайтарумәніретінде функция
- •30. Кірістірілгенфункциялар. Функциянышамадантысжүктеу.
- •31. Рекурсивный вызов функций. Безымянные функции.
- •32.Замыкания. Функция как замыкания
- •33. Замыкание.Замыкающие выражение
- •Неявные возвраты из замыканий с одним выражением
- •Сокращенные имена аргументов
- •Создание нового отсортированного массива#
- •Сортировка существующего массива на месте#
- •Сортировка массива с пользовательским заказом#
- •38.Объектно-ориентированное программирование в Swift. Экземпляры
- •43. Собственны еинициализаторы
- •44. Методы в структурах
- •45.Сыныптар құрылымдарға өте ұқсас, бірақ олар бірнеше маңызды нүктелермен ерекшеленеді.
- •Переопределение свойств
- •52.Псевдоним Any.Приведение типа Any.Псевдоним AnyObject
- •53.Инициализаторы
- •54.Деинициализаторы
- •Создание Auto Layout и его составляющих
- •. Понятие Segues. Виды Segues.
- •59. Создание программируемых переходов. (ProgrammaticSeguesiniOs)
- •60 .Передачаданныхмеждуконтроллерами. (Passing Data Between Controllers)
- •Отображение данных в мобильном приложении ввиде списка. Работа с таблицами в iOs (Working With Tables)
- •Понятие делегата и протокола на примере работы с таблицами. Назначение и принцип работы. (Table delegates and protocols)
- •Опциональные протоколы
- •Использование протоколов
- •Делегаты
- •Создание и отображение данных в ячейках (Creating custom table cell)
- •Принципы работы с Core Data (Working With Core Data, Saving to Core Data, Fetching data from Core Data, Deleting items from Core Data)
- •Понятие и назначение rest & crud (Understanding rest & crud)
- •67.Асинхронды
- •68. Создание post запросов (Making post requests)
- •Размеры и другие детали внешнего исполнения[править | править код]
52.Псевдоним Any.Приведение типа Any.Псевдоним AnyObject
Swift предлагает два специальных псевдонима, позволяющих работать с не определенными типами:
AnyObject соответствует произвольному экземпляру любого класса;
Any соответствует произвольному типу данных.
Данные псевдонимы позволяют корректно обрабатывать ситуации, когда конкретное наименование типа или класса неизвестно либо набор возможных типов может быть разнородным.
Псевдоним Any
Благодаря псевдониму Any можно создавать хранилища неопределенного типа данных. Объявим массив, который может содержать элементы произвольных типов.Пример:
var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append("hello")
things.append((3.0, 5.0))
things.append({ (name: String) -> String in "Hello, \(name)" })
Массив things содержит значения типов: Int, Double, String, (Double, Double) и (String)->String. То есть перед вами целый набор различных типов данных.
При запросе любого из элементов массива вы получите значение не того типа данных, который предполагался при установке конкретного значения, а типа Any.
ПРИМЕЧАНИЕ Псевдоним Any несовместим с протоколом Hashable, поэтому использование типа Any там, где необходимо сопоставление, невозможно. Это относится, например, к ключам словарей.
Приведение типов - это способ проверки типа экземпляра или обработки этого экземпляра как другого суперкласса или подкласса где-то еще в его собственной иерархии классов.
Приведение типа Any
Для анализа каждого элемента массива необходимо выполнить приведение типа. Так вы сможете получить каждый элемент, преобразованный в его действительный тип данных. Рассмотрим пример, в котором разберем объявленный ранее массив поэлементно и определим тип данных каждого элемента.
for thing in things {
switch thing {
case let someInt as Int:
print("an integer value of \(someInt)")
case let someDouble as Double where someDouble > 0:
print("a positive double value of \(someDouble)")
case let someString as String:
print("a string value of \"\(someString)\"")
case let (x, y) as (Double, Double):
print("an (x, y) point at \(x), \(y)")
case let stringConverter as (String) -> String:
print(stringConverter("Troll"))
default:
print("something else")
}
}
Консоль
an integer value of 0
something else
an integer value of 42
a string value of "hello"
an (x, y) point at 3.0, 5.0
Hello, Troll
Каждый из элементов массива преобразуется в определенный тип при
помощи оператора as. При этом в конструкции switch-case данный
оператор не требует указывать какой-либо постфикс (знак восклицания или вопроса).
Псевдоним AnyObject
Псевдоним AnyObject позволяет указать на то, что в данном месте должен или может находиться экземпляр любого класса. При этом вы будете довольно часто встречать массивы данного типа при разработке программ с использованием фреймворка Cocoa Foundation. Данный фреймворк написан на Objective-C, а этот язык не имеет массивов с явно указанными типами данных. Объявим массив экземпляров с помощью псевдонима AnyObject.
let someObjects: [AnyObject] = [Dog(), NoisyDog(), Dog()]
При использовании псевдонима AnyObject нет ограничений на использование классов только из одной иерархической структуры. В данном примере если вы извлекаете произвольный элемент массива, то получаете экземпляр класса AnyObject, не имеющий свойств и методов для взаимодействия с ним.
Приведение типа AnyObject
Порой вы точно знаете, что все элементы типа AnyObject на самом деле имеют некоторый определенный тип. В таком случае для анализа элементов типа AnyObject необходимо выполнить приведение типа.
for object in someObjects {
let animal = object as! Dog
print(animal.type) }
Консоль
dog
dog
dog