Что такое метатип в swift
ОТВЕТЫ
Ответ 1
Вот быстрый пример:
Допустим, каждая сущность представлена двумя вещами:
Метатип: # entity name #.Type
Тип метатипа относится к типу любого типа, включая типы классов, типы структур, типы перечисления и типы протоколов.
Вы можете быстро заметить, что это рекурсивно и может быть с помощью таких типов, как (((T.Type).Type).Type) и так далее.
.Type возвращает экземпляр метатипа.
Есть два способа получить экземпляр метатипа:
Для более любопытных людей:
Ответ 2
Где это используется?
Но зачем функции нужен тип?
Подробнее о внутренностях и как это работает:
Если вы не уверены, что означает «Свифт».сделай тогда выше, потом посмотри комментарии отсюда
Вышесказанное также можно записать так:
Вы можете использовать самовыражение postfix для доступа к типу в качестве значения. Например, SomeClass.self возвращает сам SomeClass, а не экземпляр SomeClass. И SomeProtocol.self возвращает сам SomeProtocol, а не экземпляр типа, который соответствует SomeProtocol во время выполнения. Вы можете использовать выражение типа (of 🙂 с экземпляром типа для доступа к динамическим типам экземпляров в качестве значения, как показано в следующем примере:
Код детской площадки:
Простой пример
Тяжелый пример
Я настоятельно рекомендую прочитать документацию Apple по типам. Также смотрите здесь
Ответ 3
Они появляются в разных местах синтаксически.
5 Answers 5
Here is a quick example:
Let’s say that each entity is represented by two things:
Type: # entitiy name #
A metatype type refers to the type of any type, including class types, structure types, enumeration types, and protocol types.
You can quickly notice that this is recursive and there can by types like (((T.Type).Type).Type) and so on.
.Type returns an instance of a metatype.
There are two ways we can get an instance of a metatype:
For more curious people:
First and foremost see Apple docs on type(of:)
The functions signature is interesting:
Where is it used?
But why would a function ever need a type?
Normally a function which requires a type, is a function that instantiates objects for you. I can think of two good examples:
More about the internals and how it works:
If you are confused as to what does ‘Swift.’ do then above, then see the comments from here
The above could have also been written as:
You can use the postfix self expression to access a type as a value. For example, SomeClass.self returns SomeClass itself, not an instance of SomeClass. And SomeProtocol.self returns SomeProtocol itself, not an instance of a type that conforms to SomeProtocol at runtime. You can use a type(of:) expression with an instance of a type to access that instance’s dynamic, runtime type as a value, as the following example shows:
Easy example
Hard example
I highly recommend to read Apple documentation on Types. Also see here
Документация
Методы
Методы
Дело в том, что структуры и перечисления могут определить методы в Swift, что является главным отличием от C или Objective-C. В Objective-C классы единственный тип, который может определять методы. В Swift вы можете выбирать, стоит ли вам определять класс, структуру или перечисление, и вы все равно, при любом раскладе, получаете возможность определения методов типа, который вы создадите.
Методы экземпляра
Методы экземпляра являются функциями, которые принадлежат экземплярам конкретного класса, структуры или перечисления. Они обеспечивают функциональность этих экземпляров, либо давая возможность доступа и изменения свойств экземпляра, либо обеспечивая функциональность экземпляра в соответствии с его целью. Методы экземпляра имеют абсолютно одинаковый синтаксис как и функции, что описаны в разделе Функции.
Вы пишете метод экземпляра внутри фигурных скобок типа, которому он принадлежит. Метод экземпляра имеет неявный доступ ко всем остальным методам экземпляра и свойствам этого типа. Метод экземпляра может быть вызван только для конкретного экземпляра типа, которому он принадлежит. Его нельзя вызвать в изоляции, без существующего экземпляра.
Класс Counter() определяет три метода экземпляра:
Вы можете вызвать методы экземпляра с тем же точечным синтаксисом:
Параметры функций могут иметь и имя аргумента (для использования внутри функций), и ярлык аргумента (для использования при вызове функций), что описано Ярлыки аргументов и имена параметров функций. То же самое верно для имен параметров методов, потому как методы те же самые функции, но ассоциированные с определенным типом.
Свойство self
Метод increment может быть вызван так:
Главное исключение из этого правила получается, когда имя параметра метода экземпляра совпадает с именем свойства экземпляра. В этой ситуации имя параметра имеет приоритет и появляется необходимость ссылаться на свойство в более подходящей форме. Вы используете свойство self для того, чтобы увидеть различие между именем параметра и именем свойства.
Здесь self разграничивает параметр метода x и свойство экземпляра, которое тоже x :
Изменение типов значений методами экземпляра
Структуры и перечисления являются типами значений. По умолчанию, свойства типов значений не могут быть изменены изнутри методов экземпляра.
Вы можете все это осуществить, если поставите ключевое слово mutating перед словом func для определения метода:
Обратите внимание, что вы не можете вызвать изменяющий ( mutating ) метод для константных типов структуры, потому как ее свойства не могут быть изменены, даже если свойства являются переменными, что описано в главе Свойства хранения постоянных экземпляров структуры.
Присваивание значения для self внутри изменяющего метода
Изменяющие методы для перечислений могут установить отдельный член перечисления как неявный параметр self :
Методы типа
Заметка
В Objective-C определять методы типов можно только для классов. В Swift вы можете создавать методы типа не только для классов, но и для структур и перечислений. Метод каждого типа ограничен самим типом, который его поддерживает.
Такие методы так же используют точечный синтаксис, как и методы экземпляра. Однако эти методы вы вызываете самим типом, а не экземпляром этого типа. Вот как вы можете вызвать метод самим классом SomeClass :
Внутри тела метода типа неявное свойство self ссылается на сам тип, а не на экземпляр этого типа. Это значит, что вы можете использовать self для того, чтобы устранить неоднозначность между свойствами типа и параметрами метода типа, точно так же как вы делали для свойств экземпляра и параметров метода экземпляра.
Если обобщить, то любое имя метода и свойства, которое вы используете в теле метода типа, будет ссылаться на другие методы и свойства на уровне типа. Метод типа может вызвать другой метод типа с иным именем метода, без использования какого-либо префикса имени типа. Аналогично, методы типа в структурах и перечислениях могут получить доступ к свойствам типа, используя имя этого свойства, без написания префикса имени типа.
Все уровни игры (кроме первого уровня) заблокированы, когда играют в первый раз. Каждый раз, заканчивая уровень, этот уровень открывается и у остальных игроков на устройстве. Структура LevelTracker использует свойства и методы типа для отслеживания уровней, которые были разблокированы. Так же она отслеживает текущий уровень каждого игрока.
В дополнение к его свойствам типа и методам типа, структура LevelTracker так же отслеживает и текущий прогресс игрока в игре. Она использует свойство экземпляра currentLevel для отслеживания уровня, на котором игрок играет.
Вы можете создать экземпляр класса Player для нового игрока и увидеть, что будет, когда игрок закончит первый уровень:
Если вы создадите второго игрока, и попробуете им начать прохождение уровня, который не был разблокирован ни одним игроком в игре, то вы увидите, что эта попытка будет неудачной:
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Что такое метатип в swift
Разработчик
Swift язык программирования
iBook
В этой главе рассматриваются типы, определенные на самом языке Swift, и описывает поведение вывода типа Swift.
Введите аннотацию
Аннотация типа явно указывает тип переменной или выражения. Аннотации типа начинаются с двоеточия ( : ) и конец с типом, поскольку следующие примеры показывают:
Аннотации типа могут содержать дополнительный список атрибутов типа перед типом.
Грамматика аннотации типа
аннотация типа → : «атрибуты выбирают тип»
Идентификатор типа
Идентификатор типа относится к именованному типу или к псевдониму типа именованного или составного типа.
Грамматика идентификатора типа
Тип «кортеж»
Тип «кортеж» является списком разделенных запятой значений нуля или большего количества типов, включенных в круглые скобки.
Грамматика типа «кортеж»
Функциональный тип
Поскольку тип параметра и тип возврата могут быть типом «кортеж», функция вводит функции поддержки и методы, берущие многократные параметры и возвращающие многократные значения.
Можно применяться autoclosure припишите объявлению параметра для функционального типа, имеющего тип параметра () и это возвращает тип выражения (см. Атрибуты Объявления ). Функция автозакрытия получает неявное закрытие по указанному выражению вместо самого выражения. Следующий пример использует autoclosure атрибут в определении очень простого утверждает функцию:
Грамматика функционального типа
Тип массива
Язык Swift предоставляет следующий синтаксический сахар библиотеке стандарта Swift Array тип:
Другими словами, следующие два объявления эквивалентны:
Можно создать многомерные массивы вложенными парами квадратных скобок, где имя базового типа элементов содержится в самой внутренней паре квадратных скобок. Например, можно создать трехмерную антенную решетку целых чисел с помощью трех наборов квадратных скобок:
Грамматика типа массива
Тип словаря
Язык Swift предоставляет следующий синтаксический сахар библиотеке стандарта Swift Dictionary тип:
Другими словами, следующие два объявления эквивалентны:
В обоих случаях, константа someDictionary объявляется как словарь со строками как ключи и целые числа как значения.
Ключевой тип словаря должен соответствовать библиотеке стандарта Swift Hashable протокол.
Грамматика типа словаря
Дополнительный тип
Грамматика дополнительного типа
Неявно развернутый дополнительный тип
Можно использовать неявно развернутый optionals во всем одинаковом места в коде, что можно использовать optionals. Например, можно присвоить значения неявно развернутого optionals к переменным, константам и свойствам optionals, и наоборот.
Грамматика неявно развернутого дополнительного типа
Тип состава протокола
Тип состава протокола описывает тип, соответствующий каждому протоколу в списке указанных протоколов. Типы состава протокола могут использоваться в аннотациях типа и в универсальных параметрах.
Типы состава протокола имеют следующую форму:
Тип состава протокола позволяет Вам указывать значение, тип которого соответствует требованиям многократных протоколов, не имея необходимость явно определять новый, именованный протокол, наследовавшийся из каждого протокола, которому Вы хотите, чтобы тип соответствовал. Например, указывая тип состава протокола protocol
Каждый элемент в списке состава протокола должен быть или именем протокола или псевдонимом типа типа состава протокола. Если список пуст, он указывает пустой тип состава протокола, которому соответствует каждый тип.
Грамматика типа состава протокола
Тип метатипа
Тип метатипа относится к типу любого типа, включая типы классов, типы структуры, типы перечисления и типы протокола.
Грамматика типа метатипа
Введите пункт наследования
Пункт наследования типа используется для указания, которые классифицируют именованный тип, наследовался от и который протоколирует именованный тип, соответствует. Пункт наследования типа также используется для указания a class требование к протоколу. Пункт наследования типа начинается с двоеточия ( : ), сопровождаемый любым a class требование, список идентификаторов типов или обоих.
Грамматика пункта наследования типа
требование класса → class
Вывод типа
В обоих из примеров выше, от информации о типе отказываются от листов дерева выражений к его корню. Т.е. тип x в var x: Int = 0 выведен первой проверкой типа 0 и затем передавая эту информацию о типе до корня (переменная x ).
Вывод типа в Swift работает на уровне отдельного выражения или оператора. Это означает, что вся информация должна была вывести опущенный тип, или часть типа в выражении должна быть доступной от проверки типа выражение или одно из его подвыражений.
Документация
Типы данных, которые обычно считаются основными или примитивными в других языках, такие как типы, которые представляют цифры, символы и строки-фактически именованные типы, определены и реализованы в стандартной библиотеке Swift с использованием структур. Так как это именованные типы, вы можете расширить их поведение для удовлетворения потребностей вашей программы, используя объявление расширения, которое рассматривается в главе «Расширения».
В этой главе рассматриваются типы, определяемые самостоятельно в языке Swift и описывается поведение выводимых типов в Swift.
Грамматика типа
Аннотация типа
Аннотация типа явно указывает на тип переменной или выражения. Аннотации типов начинаются с двоеточия ( : ) и заканчиваются именем типом, как показано в следующем примере:
Аннотации типа могут содержать дополнительный список атрибутов типа перед типом.
Грамматика аннотации типа
Идентификатор типа
Идентификатор типа относится либо к именованному типу, либо к псевдониму именованного или составного типа.
Грамматика идентификатора типа
Тип кортежа
Тип кортежа представляет собой разделенный запятыми список из нуля или более типов, заключенных в круглые скобки.
Вы можете использовать тип кортежа в качестве возвращаемого типа функции. Чтобы функция возвращала один кортеж, содержащий несколько значений. Можно также называть элементы типа кортежа и использовать эти имена для обозначения значений отдельных элементов. Имя элемента состоит из идентификатора, за которым сразу следует двоеточие ( : ). Примером, демонстрирующим эти обе функции, будет раздел Параметры функции и возвращаемые значения.
Если элемент кортежа имеет имя, то имя является частью типа:
Грамматика кортежного типа
Функциональный тип
Поскольку тип параметров и возвращаемый тип могут быть типами кортежа, функциональные типы поддерживают функции и методы, которые принимают несколько параметров и возвращают несколько значений.
Имена аргументов не являются частью типа соответствующей функции:
Поскольку аргументы Labels не являются частью типа функции, вы опускаете их при написании типа функции.
Ограничения для несбегающих замыканий
Параметр, который является не ускользающей функцией, не может быть передан в качестве аргумента другому параметру несобранной функции. Это ограничение помогает Swift выполнять больше проверок на конфликтный доступ к памяти во время компиляции, а не во время выполнения. Например:
Грамматика функционального типа
Типы массива
Язык Swift предоставляет следующий синтаксический сахар для стандартной библиотеки Swift тип Array :
Другими словами, следующие два объявления эквивалентны:
Вы можете создавать многомерные массивы, наслаивая пары квадратных скобок, где имя базового типа элементов содержится в самой внутренней паре квадратных скобок. Например, вы можете создать трехмерный массив целых чисел, используя три набора квадратных скобок:
Более подробно о стандартном типе Array библиотеки Swift, см. «Массивы».
Грамматика типа массива
Тип словаря
Язык Swift предоставляет следующий синтаксический сахар для типа Dictionary стандартной библиотеки Swift:
Другими словами, следующие два объявления эквивалентны:
В обоих случаях константа someDictionary объявляется как словарь со строками в качестве ключей и целых чисел в качестве значений.
Основной тип ключа словаря должен соответствовать протоколу Hashable стандартной библиотеки Swift.
Грамматика типа словаря
Опциональный тип
Для получения дополнительной информации см. Опционалы.
Грамматика опционального типа
Неявно извлеченный опциональный тип
Так как неявное извлечение изменяет смысл объявления, которое содержит тип, опциональные типы, которые являются вложенными внутри кортежа или универсального типа, например элемент словаря или массива, не могут быть обозначены как неявно извлеченные. Например:
Для получения дополнительной информации см. в разделе Неявно извлеченные опционалы.
Грамматика неявно извлеченного опционального типа
Тип композиции протоколов
Тип композиции протоколов описывает тип, соответствующий каждому протоколу в списке указанных протоколов. Тип композиции протоколов может быть использован в типе аннотаций и в параметрах универсального типа.
Тип композиции протоколов выглядит следующим образом:
Каждый элемент в списке композиции протокола должен быть (этот список может иметь всего один класс):
Грамматика типа композиции протоколов
Тип метатипа
Тип метатипа относится к типу любого типа, в том числе к типам класса, типам конструкций, типам перечислений и типам протоколов.
Для получения дополнительной информации, см. type (of: ) стандартной библиотеке Swift.
Грамматика метатипа
Наследование типа
Типы классов могут наследовать от одного суперкласса и соответствовать любому количеству протоколов. При определении класса, имя суперкласса должно появиться в начале списка идентификаторов типа, за которым уже будут следовать протоколы, которым класс должен соответствовать. Если класс не наследует от другого класса, список может начинаться вместо этого с протокола. Подробнее см. Наследование.
Другие именованные типы могут только наследовать или соответствовать списку протоколов. Типы протоколов могут наследовать от любого количества других протоколов. Когда тип протокола наследует от других протоколов, и требования от всех протоколов собираются в совокупность, и любой тип, наследующий от текущего протокола, должен соответствовать всем этим требованиям. Как обсуждалось ранее, вы можете включить ключевое слово class в качестве первого пункта в условие типа наследования, чтобы отметить объявление протокола с class-требованием.
Наследование типа в определении перечисления может быть либо список протоколов, или в случае перечисления, которое присваивает исходные значенияк своим кейсам, может быть один, именованный тип, который определяет тип этих исходных значений. Подробнее Исходные значения.
Грамматика наследования типа
Вывод типа
Вывод типа в Swift работает на уровне одного выражения или утверждения. Это означает, что вся информация, необходимая для вывода пропущенного типа или части типа в выражении должна быть доступна из проверки типов выражения или одного из его подвыражений.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.