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

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

Разработчик

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

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

Универсальные параметры и параметры

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

Для обзора обобщений в Swift посмотрите Обобщения.

Универсальный пункт параметра

Универсальный пункт параметра указывает параметры типа универсального типа или функции, вместе с любыми связанными ограничениями и требованиями к тем параметрам. Универсальный пункт параметра включается в угловые скобки (<>) и имеет одну из следующих форм:

  • <generic parameter list>
  • <generic parameter list where requirements>

Универсальный список параметров является списком разделенных запятой значений универсальных параметров, каждый из которых имеет следующую форму:

  • type parameter: constraint

Универсальный параметр состоит из параметра типа, сопровождаемого дополнительным ограничением. Параметр типа является просто именем типа заполнителя (например, T, U, V, Key, Value, и т.д.). У Вас есть доступ к параметрам типа (и любой из их связанных типов) в остальной части типа, функции или объявления инициализатора, включая в подписи функции или инициализатора.

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

  • func simpleMax<T: Comparable>(x: T, y: T) -> T {
  • if x < y {
  • return y
  • }
  • return x
  • }

Поскольку Int и Double, например, оба соответствуют Comparable протокол, эта функция принимает параметры любого типа. В отличие от универсальных типов, Вы не указываете универсальный пункт параметра при использовании родовой функции или инициализатора. Аргументы типа вместо этого выведены из типа параметров, переданных функции или инициализатору.

  • simpleMax(17, 42) // T is inferred to be Int
  • simpleMax(3.14159, 2.71828) // T is inferred to be Double

Операторы Where

Можно указать дополнительные требования на параметрах типа и их связанных типах включением a where пункт после универсального списка параметров. A where пункт состоит из ключевого слова where, сопровождаемый списком разделенных запятой значений одного или более требований.

Требования в a where пункт указывает, что параметр типа наследовался от класса или соответствует составу протокола или протокола. Несмотря на то, что where пункт обеспечивает синтаксический сахар для выражения простых ограничений на параметры типа (например, T: Comparable эквивалентно T where T: Comparable и т.д.), можно использовать его для обеспечения более сложных ограничений на параметры типа и их связанные типы. Например, можно выразить ограничения что универсальный тип T наследовался от класса C и соответствует протоколу P как <T where T: C, T: P>.

Как упомянуто выше, можно ограничить связанные типы параметров типа соответствовать протоколам. Например, универсальный пункт параметра <T: Generator where T.Element: Equatable> указывает это T соответствует Generator протокол и связанный тип T, T.Element, соответствует Equatable протокол (T имеет связанный тип Element потому что Generator объявляет Element и T соответствует Generator).

Можно также указать требование что два типа быть идентичными, с помощью == оператор. Например, универсальный пункт параметра <T: Generator, U: Generator where T.Element == U.Element> выражает ограничения это T и U соответствуйте Generator протокол и что их связанные типы должны быть идентичными.

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

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

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

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

универсальный список параметров универсальный параметр - универсальный параметр -универсальный список параметров -

универсальный параметр имя типа -

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

универсальный параметр имя типа -тип состава протокола -

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

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

«то же требование типа » → идентификатор типа -==­введите -

Универсальный пункт параметра

Универсальный пункт параметра указывает аргументы типа универсального типа. Универсальный пункт параметра включается в угловые скобки (<>) и имеет следующую форму:

  • <generic argument list>

Универсальный список аргументов является списком разделенных запятой значений аргументов типа. Аргумент типа является именем фактического конкретного типа, заменяющего соответствующий параметр типа в универсальном пункте параметра универсального типа. Результатом является специализированная версия того универсального типа. Как пример, библиотека стандарта Swift определяет универсальный тип словаря как:

  • struct Dictionary<Key: Hashable, Value>: CollectionType, DictionaryLiteralConvertible {
  • /* ... */
  • }

Специализированная версия обобщения Dictionary введите, Dictionary<String, Int> формируется путем замены универсальных параметров Key: Hashable и Value с конкретными аргументами типа String и Int. Каждый аргумент типа должен удовлетворить все ограничения универсального параметра, который он заменяет, включая любые дополнительные требования, указанные в a where пункт. В примере выше, Key параметр типа ограничивается соответствовать Hashable протокол и поэтому String должен также соответствовать Hashable протокол.

Можно также заменить параметр типа аргументом типа, который является самостоятельно специализированной версией универсального типа (если это удовлетворяет надлежащие ограничения и требования). Например, можно заменить параметр типа T в Array<T> со специализированной версией массива, Array<Int>, сформировать массив, элементы которого являются самостоятельно массивами целых чисел.

  • let arrayOfArrays: Array<Array<Int>> = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Как упомянуто в Универсальном Пункте Параметра, Вы не используете универсальный пункт параметра для указания аргументов типа родовой функции или инициализатора.

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

универсальный пункт параметра универсальный список аргументов -

универсальный список аргументов универсальный параметр - универсальный параметр -универсальный список аргументов -

универсальный параметр тип -