Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека разработчика XCode

Разработчик

Swift язык программирования

iBook
На этой странице

Типы

В Swift существует два вида типов: названные типы и составные типы. Именованный тип является типом, которому можно дать определенное имя, когда он определяется. Названные типы включают классы, структуры, перечисления и протоколы. Например, экземпляры определяемого пользователем класса называют MyClass имейте тип MyClass. В дополнение к определяемым пользователем именованным типам библиотека стандарта Swift определяет много обычно используемых именованных типов, включая тех, которые представляют массивы, словари и дополнительные значения.

Типы данных, которые обычно считают основными или примитивными на других языках — таких как типы, представляющие числа, символы и строки — фактически называют типами, определили и реализовали в библиотеке стандарта Swift с помощью структур. Поскольку их называют типами, можно расширить их поведение удовлетворить потребностям программы, с помощью объявления расширения, обсужденного в Расширениях и Объявлении расширения.

Составной тип является типом без имени, определенного на самом языке Swift. Существует два составных типа: функционируйте типы и типы «кортеж». Составной тип может содержать названные типы и другие составные типы. Например, тип «кортеж» (Int, (Int, Int)) содержит два элемента: первым является именованный тип Int, и вторым является другой составной тип (Int, Int).

В этой главе рассматриваются типы, определенные на самом языке Swift, и описывает поведение вывода типа Swift.

Введите аннотацию

Аннотация типа явно указывает тип переменной или выражения. Аннотации типа начинаются с двоеточия (:) и конец с типом, поскольку следующие примеры показывают:

  • let someTuple: (Double, Double) = (3.14159, 2.71828)
  • func someFunction(a: Int) { /* ... */ }

В первом примере, выражении someTuple указан для имения типа «кортеж» (Double, Double). Во втором примере, параметре a к функции someFunction указан для имения типа Int.

Аннотации типа могут содержать дополнительный список атрибутов типа перед типом.

Грамматика аннотации типа

аннотация типа «атрибуты выбирают тип»

Идентификатор типа

Идентификатор типа относится к именованному типу или к псевдониму типа именованного или составного типа.

Большую часть времени идентификатор типа непосредственно относится к именованному типу с тем же именем как идентификатор. Например, Int идентификатор типа, непосредственно относящийся к именованному типу Int, и идентификатор типа Dictionary<String, Int> непосредственно относится к именованному типу Dictionary<String, Int>.

Существует два случая, в которых идентификатор типа не относится к типу с тем же именем. В первом случае идентификатор типа относится к псевдониму типа именованного или составного типа. Например, в примере ниже, использование Point в типе аннотация относится к типу «кортеж» (Int, Int).

  • typealias Point = (Int, Int)
  • let origin: Point = (0, 0)

Во втором случае идентификатор типа использует точку (.) синтаксис для обращения к именованным типам, объявленным в других модулях или вложенным в других типах. Например, идентификатор типа в следующем коде ссылается на именованный тип MyType это объявляется в ExampleModule модуль.

  • var someValue: ExampleModule.MyType

Грамматика идентификатора типа

идентификатор типа «имя типа, универсальный пункт параметра выбирает» «имя типа универсальный пункт параметра, выбирает» идентификатор типа -

имя типа идентификатор -

Тип «кортеж»

Тип «кортеж» является списком разделенных запятой значений нуля или большего количества типов, включенных в круглые скобки.

Можно использовать тип «кортеж» в качестве типа возврата функции, чтобы позволить функции возвратить единственный кортеж, содержащий многократные значения. Можно также назвать элементы типа «кортеж» и использовать те имена для обращения к значениям отдельных элементов. Имя элемента состоит из идентификатора, сопровождаемого сразу двоеточием (:). Для примера, демонстрирующего обе из этих функций, посмотрите Функции с Многократными Возвращаемыми значениями.

Void typealias для пустого типа «кортеж», (). Если существует только один элемент в круглых скобках, тип является просто типом того элемента. Например, тип (Int) Int, нет (Int). В результате можно назвать элемент кортежа только, когда тип «кортеж» имеет два или больше элемента.

Грамматика типа «кортеж»

тип «кортеж» «организация типа «кортеж» выбирает»

организация типа «кортеж» «список элемента типа «кортеж»»...­выберите -

элемент типа кортежа перечисляет элемент типа «кортеж» - элемент типа «кортеж» -«список элемента типа «кортеж»»

элемент типа «кортеж» «атрибуты выбирает»inout­выбирать-тип - inout­«выберите аннотация типа имени элемента»

имя элемента идентификатор -

Функциональный тип

Функциональный тип представляет тип функции, метода или закрытия и состоит из параметра и типа возврата, разделенного стрелкой (->):

  • parameter type -> return type

Поскольку тип параметра и тип возврата могут быть типом «кортеж», функция вводит функции поддержки и методы, берущие многократные параметры и возвращающие многократные значения.

Можно применяться autoclosure припишите объявлению параметра для функционального типа, имеющего тип параметра () и это возвращает тип выражения (см. Атрибуты Объявления). Функция автозакрытия получает неявное закрытие по указанному выражению вместо самого выражения. Следующий пример использует autoclosure атрибут в определении очень простого утверждает функцию:

  • func simpleAssert(@autoclosure condition: () -> Bool, message: String) {
  • if !condition() {
  • println(message)
  • }
  • }
  • let testNumber = 5
  • simpleAssert(testNumber % 2 == 0, "testNumber isn't an even number.")
  • // prints "testNumber isn't an even number."

Функциональный тип может иметь variadic параметр как последний параметр в его типе параметра. Синтаксически, variadic параметр состоит из имени базового типа, сопровождаемого сразу тремя точками (...), как в Int.... variadic параметр обрабатывается как массив, содержащий элементы имени базового типа. Например, variadic параметр Int... обрабатывается как [Int]. Для примера, использующего variadic параметр, см. Параметры Variadic.

Для указания изменяемого параметра снабдите префиксом тип параметра inout ключевое слово. Вы не можете отметить variadic параметр или тип возврата с inout ключевое слово. Изменяемые параметры обсуждены в Изменяемых параметрах.

Функциональные типы функции с приправой карри сгруппированы справа налево. Например, функциональный тип Int -> Int -> Int понят как Int -> (Int -> Int)— т.е. функция, берущая Int и возвращают другая функция, берущая и возврат Int. Функция с приправой карри описана в Функциях С приправой карри.

Грамматика функционального типа

функциональный тип тип -->­введите -

Тип массива

Язык Swift предоставляет следующий синтаксический сахар библиотеке стандарта Swift Array<T> тип:

  • [type]

Другими словами, следующие два объявления эквивалентны:

  • let someArray: Array<String> = ["Alex", "Brian", "Dave"]
  • let someArray: [String] = ["Alex", "Brian", "Dave"]

В обоих случаях, константа someArray объявляется как массив строк. К элементам массива можно получить доступ посредством преобразования в нижний индекс путем указания допустимого индексного значения в квадратных скобках: someArray[0] относится к элементу в индексе 0, "Alex".

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

  • var array3D: [[[Int]]] = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

При доступе к элементам в многомерном массиве крайний левый нижний индекс относится к элементу в том индексе в наиболее удаленном массиве. Следующий нижний индекс вправо относится к элементу в том индексе в массиве, в котором это вложило один уровень. И т.д. Это означает это в примере выше, array3D[0] относится к [[1, 2], [3, 4]], array3D[0][1] относится к [3, 4], и array3D[0][1][1] относится к значению 4.

Для детального обсуждения библиотеки стандарта Swift Array введите, посмотрите Массивы.

Грамматика типа массива

тип массива введите -

Тип словаря

Язык Swift предоставляет следующий синтаксический сахар библиотеке стандарта Swift Dictionary<Key, Value> тип:

  • [key type: value type]

Другими словами, следующие два объявления эквивалентны:

  • let someDictionary: [String: Int] = ["Alex": 31, "Paul": 39]
  • let someDictionary: Dictionary<String, Int> = ["Alex": 31, "Paul": 39]

В обоих случаях, константа someDictionary объявляется как словарь со строками как ключи и целые числа как значения.

К значениям словаря можно получить доступ посредством преобразования в нижний индекс путем указания соответствующего ключа в квадратных скобках: someDictionary["Alex"] относится к значению, связанному с ключом "Alex". Нижний индекс возвращает дополнительное значение типа значения словаря. Если указанный ключ не содержится в словаре, нижних возвратах nil.

Ключевой тип словаря должен соответствовать библиотеке стандарта Swift Hashable протокол.

Для детального обсуждения библиотеки стандарта Swift Dictionary введите, см. Словари.

Грамматика типа словаря

тип словаря введите -введите -

Дополнительный тип

Язык Swift определяет постфикс ? как синтаксический сахар для именованного типа Optional<T>, который определяется в библиотеке стандарта Swift. Другими словами, следующие два объявления эквивалентны:

  • var optionalInteger: Int?
  • var optionalInteger: Optional<Int>

В обоих случаях, переменная optionalInteger как объявляют, имеет тип дополнительного целого числа. Обратите внимание на то, что никакой пробел не может появиться между типом и ?.

Тип Optional<T> перечисление с двумя случаями, None и Some(T), которые используются для представления значений, которые могут или могут не присутствовать. Любой тип, как могут явно объявлять, (или неявно преобразован в), дополнительный тип. Когда Вы объявляете дополнительную переменную или свойство, его значение автоматически значения по умолчанию к, если Вы не обеспечиваете начальное значение nil.

Если экземпляр дополнительного типа содержит значение, можно получить доступ к тому значению с помощью постфиксного оператора !, как показано ниже:

  • optionalInteger = 42
  • optionalInteger! // 42

Используя ! оператор для разворачивания дополнительного, имеющего значение nil результаты в ошибке периода выполнения.

Можно также использовать дополнительное объединение в цепочку и дополнительную привязку для условного выполнения работы на дополнительном выражении. Если значение nil, никакая работа не выполняется, и поэтому никакая ошибка периода выполнения не производится.

Для получения дополнительной информации и видеть примеры, показывающие, как использовать дополнительные типы, посмотрите Optionals.

Грамматика дополнительного типа

дополнительный тип тип -

Неявно развернутый дополнительный тип

Язык Swift определяет постфикс ! как синтаксический сахар для именованного типа ImplicitlyUnwrappedOptional<T>, который определяется в библиотеке стандарта Swift. Другими словами, следующие два объявления эквивалентны:

  • var implicitlyUnwrappedString: String!
  • var implicitlyUnwrappedString: ImplicitlyUnwrappedOptional<String>

В обоих случаях, переменная implicitlyUnwrappedString как объявляют, имеет тип неявно развернутой дополнительной строки. Обратите внимание на то, что никакой пробел не может появиться между типом и !.

Можно использовать неявно развернутый optionals во всем одинаковом места в коде, что можно использовать optionals. Например, можно присвоить значения неявно развернутого optionals к переменным, константам и свойствам optionals, и наоборот.

Как с optionals, если Вы не обеспечиваете начальное значение, когда Вы объявляете неявно развернутую дополнительную переменную или свойство, его значение автоматически значения по умолчанию к nil.

Поскольку значение неявно развернутого дополнительный автоматически развернуто при использовании его нет никакой потребности использовать ! оператор для разворачивания его. Однако при попытке использовать неявно развернутый дополнительный, который имеет значение nil, Вы получите ошибку периода выполнения.

Используйте дополнительное объединение в цепочку для условного выполнения работы на неявно развернутом дополнительном выражении. Если значение nil, никакая работа не выполняется, и поэтому никакая ошибка периода выполнения не производится.

Для получения дополнительной информации о неявно развернутых дополнительных типах, посмотрите Неявно Развернутый Optionals.

Грамматика неявно развернутого дополнительного типа

неявно развернутый дополнительный тип тип -

Тип состава протокола

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

Типы состава протокола имеют следующую форму:

  • protocol<Protocol 1, Protocol 2>

Тип состава протокола позволяет Вам указывать значение, тип которого соответствует требованиям многократных протоколов, не имея необходимость явно определять новый, именованный протокол, наследовавшийся из каждого протокола, которому Вы хотите, чтобы тип соответствовал. Например, указывая тип состава протокола protocol<ProtocolA, ProtocolB, ProtocolC> эффективно то же как определение нового протокола ProtocolD это наследовалось от ProtocolA, ProtocolB, и ProtocolC, но не имея необходимость представлять новое имя.

Каждый элемент в списке состава протокола должен быть или именем протокола или псевдонимом типа типа состава протокола. Если список пуст, он указывает пустой тип состава протокола, которому соответствует каждый тип.

Грамматика типа состава протокола

тип состава протокола protocol­«список идентификатора протокола выбирает»

список идентификаторов протокола идентификатор протокола - идентификатор протокола -список идентификаторов протокола -

идентификатор протокола идентификатор типа -

Тип метатипа

Тип метатипа относится к типу любого типа, включая типы классов, типы структуры, типы перечисления и типы протокола.

Метатип класса, структуры или типа перечисления является именем того типа, сопровождаемого .Type. Метатип типа протокола — не конкретного типа, соответствующего протоколу во время выполнения — является именем того протокола, сопровождаемого .Protocol. Например, метатип типа класса SomeClass SomeClass.Type и метатип протокола SomeProtocol SomeProtocol.Protocol.

Можно использовать постфикс self выражение для доступа к типу как к значению. Например, SomeClass.self возвраты SomeClass самостоятельно, не экземпляр SomeClass. И SomeProtocol.self возвраты SomeProtocol самостоятельно, не экземпляр типа, соответствующего SomeProtocol во время выполнения. Можно использовать a dynamicType выражение с экземпляром типа для доступа к типу выполнения того экземпляра как к значению, поскольку следующий пример показывает:

  • class SomeBaseClass {
  • class func printClassName() {
  • println("SomeBaseClass")
  • }
  • }
  • class SomeSubClass: SomeBaseClass {
  • override class func printClassName() {
  • println("SomeSubClass")
  • }
  • }
  • let someInstance: SomeBaseClass = SomeSubClass()
  • // someInstance is of type SomeBaseClass at compile time, but
  • // someInstance is of type SomeSubClass at runtime
  • someInstance.dynamicType.printClassName()
  • // prints "SomeSubClass"

Грамматика типа метатипа

тип метатипа тип -Type­ введите -Protocol­

Введите пункт наследования

Пункт наследования типа используется для указания, которые классифицируют именованный тип, наследовался от и который протоколирует именованный тип, соответствует. Пункт наследования типа также используется для указания a class требование к протоколу. Пункт наследования типа начинается с двоеточия (:), сопровождаемый любым a class требование, список идентификаторов типов или обоих.

Типы классов могут наследоваться от единственного суперкласса и соответствовать любому числу протоколов. При определении класса имя суперкласса должно казаться первым в списке идентификаторов типов, сопровождаемых любым числом протоколов, которым должен соответствовать класс. Если класс не наследовался от другого класса, список может начаться с протокола вместо этого. Для расширенного обсуждения и нескольких примеров наследования классов, посмотрите Наследование.

Другие именованные типы могут только наследоваться от или соответствовать списку протоколов. Типы протокола могут наследоваться от любого числа других протоколов. Когда тип протокола наследовался из других протоколов, набор требований из тех других протоколов агрегированы вместе, и любой тип, наследовавшийся из текущего протокола, должен соответствовать всем тем требованиям. Как обсуждено в Объявлении Протокола, можно включать class ключевое слово как первый элемент в пункте наследования типа, который отметит объявление протокола с a class требование.

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

Грамматика пункта наследования типа

пункт наследования типа требование класса -список наследования типа -

пункт наследования типа требование класса -

пункт наследования типа список наследования типа -

список наследования типа идентификатор типа - идентификатор типа -список наследования типа -

требование класса class­

Вывод типа

Swift использует вывод типа экстенсивно, позволяя Вам опустить тип или часть типа многих переменных и выражений в Вашем коде. Например, вместо записи var x: Int = 0, можно записать var x = 0, исключение типа полностью — компилятор правильно выводит это x называет значение типа Int. Когда полный тип может быть выведен из контекста, точно так же можно опустить часть типа. Например, если Вы пишете let dict: Dictionary = ["A": 1], компилятор выводит это dict имеет тип Dictionary<String, Int>.

В обоих из примеров выше, от информации о типе отказываются от листов дерева выражений к его корню. Т.е. тип x в var x: Int = 0 выведен первой проверкой типа 0 и затем передавая эту информацию о типе до корня (переменная x).

В Swift информация типа может также течь в противоположном направлении — от корня вниз к листам. В следующем примере, например, явная аннотация типа (: Float) на константе eFloat вызывает числовой литерал 2.71828 иметь выведенный тип Float вместо Double.

  • let e = 2.71828 // The type of e is inferred to be Double.
  • let eFloat: Float = 2.71828 // The type of eFloat is Float.

Вывод типа в Swift работает на уровне отдельного выражения или оператора. Это означает, что вся информация должна была вывести опущенный тип, или часть типа в выражении должна быть доступной от проверки типа выражение или одно из его подвыражений.