Что определяет метку аргумента функции при её вызове в Swift?
Метка аргумента задаётся объявлением параметра и определяет имя, которое вызывающий код пишет перед значением. Она может совпадать с локальным именем параметра, отличаться от него или быть явно отключена. По умолчанию у обычной функции первый параметр вызывается без метки, а последующие получают метку, совпадающую с их именем.
Swift разделяет имя параметра внутри функции и его внешнюю метку, чтобы вызовы API были одновременно читаемыми и удобными. Такой подход позволяет сделать вызов похожим на естественную фразу, не заставляя реализацию использовать те же имена, что и внешний интерфейс.
Разделение также помогает явно выразить смысл каждого аргумента. Например, внешняя метка может описывать роль значения, тогда как внутреннее имя может быть короче или удобнее для реализации.
Если перепутать локальное имя параметра с меткой аргумента, можно получить ошибку компиляции при вызове функции или непонятный публичный интерфейс. Особенно часто это происходит при изменении имени параметра внутри реализации: его локальное имя можно изменить независимо от кода вызова только при сохранении внешней метки.
Неверно выбранная метка ухудшает читаемость вызовов и может привести к несовместимому изменению API. Для публичных функций метки являются частью синтаксического контракта вызова, поэтому их следует проектировать осознанно.
В объявлении параметр может иметь две роли: метку аргумента для вызывающего кода и имя параметра внутри тела функции. Синтаксически они записываются как внешняя метка, затем внутреннее имя.
В примере to и animated — метки аргументов, а destination и animated — локальные имена параметров. У первого параметра метка to задана явно, поэтому она обязательна при вызове. Символ _ отключает метку, как у параметра message.
Метка влияет на синтаксис вызова и на выбор подходящей перегрузки, но не является частью значения, передаваемого в функцию. Имя параметра используется только внутри функции и недоступно вызывающему коду.
Для функций без явно заданных меток действует стандартное правило: первый параметр обычно вызывается без метки, а остальные — с метками. Явная запись позволяет изменить это поведение, поэтому при чтении объявления нужно смотреть именно на его сигнатуру, а не полагаться только на позицию параметра.
Команда разрабатывает API навигации. Вариант с вызовом, где оба аргумента передаются только по позиции, короче, но неясно, что означает булево значение. Вариант с описательными метками делает вызов понятнее, однако изменение этих меток позже потребует обновить все места вызова.
Можно оставить параметры с автоматически выбранными именами, но это связывает внешний API с внутренними именами реализации. Можно явно задать метки и локальные имена: такой вариант лучше фиксирует контракт и позволяет независимо рефакторить тело функции.
Практически предпочтителен второй вариант: для публичной функции следует выбирать явные, семантически понятные метки. Результатом будет более читаемый код вызова и меньше риск ошибиться при передаче нескольких значений одного типа.
Нет. Тип функции описывает типы параметров и результата, но не их метки. Поэтому метки контролируют синтаксис вызова, а не совместимость значения функции с другим функциональным типом.
Да. Метки участвуют в различении деклараций функций на уровне вызова. Две функции с одинаковыми типами параметров могут иметь разные внешние метки и выбираться по написанному вызову. Это удобно для разных смыслов операции, но чрезмерное использование таких перегрузок может усложнить поиск нужной функции.
Потому что вызывающий код использует внешнюю метку, а тело функции — внутреннее имя. Если объявление сохраняет прежнюю метку, реализацию можно переименовать без изменения мест вызова. Однако изменение самой метки меняет синтаксический контракт и требует обновления вызовов.