В чем смысл сигнатур функции: в Swift 4 и почему нет запятой, когда кажется, что она должна быть? - PullRequest
0 голосов
/ 05 февраля 2019

Вот пример того, о чем я говорю: https://developer.apple.com/documentation/foundation/nsmutableorderedset/1410287-insert

Функция вставки отображается как insert(_:at:)

Когда она фактически используется, функция вставки выглядит примерно так:

namesArray.insert("John", at: 3)

Там нет : после "John" (хотя я предполагаю, что это может быть "John":String - это то, для чего оно там?) И ,что на самом деле нужно сделать, там не указано в сигнатуре функции в документации.Должен ли я знать / предполагать, что запятая идет туда, когда я на самом деле ее использую?Это относится ко всем функциям Swift?

Обратите внимание, что это не вопрос о подчеркивании, _ - я понимаю, почему он существует и для чего он нужен.Я специально спрашиваю о причинах включения : и не включения , в сигнатуру функции.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

В сигнатуре двоеточие отделяет имя параметра от его значения.Функции имеют следующую анатомию:

func functionName(label1 parameter1: Type1, label2 paramter2: Type2) -> ReturnType {
    ...
}

, где метки - это имена, видимые при вызове функции, а параметры - имена значений, используемых в теле функции.Метка _ удаляет метку из параметра при его вызове.

При вызове функции двоеточие просто отделяет метки параметров от значений, передаваемых в функцию.Запятые разделяют разные параметры.Параметр без метки не требует двоеточия.Следующая функция вообще не имеет двоеточий:

func myFunc(_ par1: Int, _ par2: String) {
    print(par1, par2)
}

myFunc(3, "what") // 3 "what"
0 голосов
/ 05 февраля 2019

Функции Swift имеют уникальный способ задания сигнатуры, который является шаблоном переноса из Objective C. Есть 3 части для определения каждого входного аргумента для сигнатуры функции.Подпись для упомянутой вами функции выглядит следующим образом:

func insert(_ objects: [Any], 
     at indexes: IndexSet)

Давайте сначала посмотрим на второй аргумент:

  1. at обозначает метку аргумента Это то, как caller указывает параметр.
  2. indexes указывает имя параметра функции для объекта.Это означает, что в теле функции все, что было передано как at:, будет упоминаться как indexes.
  3. IndexSet - это тип аргумента.

Part 1 может быть чем-то, кроме имени, тоже:

  • , если оно не указано, имя аргумента и метка параметра одинакова.Например, если бы подпись была func insert(objects: [Any], indexes: IndexSet), функция была бы вызвана как o.insert(objects: ['a','b'], at: [1,2]).
  • Если это подчеркивание (_), то аргумент не имеет метки для вызывающей стороны.Это позволяет вызывающему абоненту использовать более простой, интуитивно понятный вызов o.insert(['a','b'], at: [1,2]).
0 голосов
/ 05 февраля 2019

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

Итак, рассмотрим это объявление функции:

func insert(_ objects: [Any], at indexes: IndexSet)

Это

  • метод с именем insert;
  • имя первого параметра называется objects, этот параметр не имеет метки аргумента (обозначается _) иимеет тип [Any]
  • имя второго параметра - indexes, метка его аргумента - at и имеет тип IndexSet.

Так вы называете его так:

insert(someObjects, at: someIndex)

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

insert(_:at:)

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

transition

Для получения дополнительной информации о метках аргументов и именах параметровсм. Ярлыки аргументов функций и имена параметров

0 голосов
/ 05 февраля 2019

A : в сигнатуре функции всегда означает входной аргумент функции.Сигнатура функции содержит метку аргумента, за которой следует :._ означает, что метка аргумента отсутствует, и в этом случае вы можете опустить : также при предоставлении этого конкретного входного аргумента для вызова функции.

Это именно то, что вы видите с insert(_:at:)функция.Вы предоставляете ему два входных аргумента, "John" и 3, но для второго входного аргумента нужна только метка аргумента, следовательно, вам нужен только один :.Также важно отметить, что во время вызова вы разделяете входные аргументы, используя ,, а не :.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...