Я пытаюсь понять дополнительные в Swift. Код работает, но я не понимаю, почему - PullRequest
1 голос
/ 23 марта 2019

Я работаю над заданием в Excercism и некоторое время проходил онлайн-курсы быстрого обучения.Я выполнил задачу и увидел это решение (в котором было гораздо меньше кода, чем у меня).Почему это необязательно?

Я не понимаю, какова цель подчеркивания в начале функции перед X и почему ее удаление нарушает код.Меня также смущает, почему он работает только с одним входным параметром, даже если для функции требуются X и Y.Кроме того, добавление «Алиса» для X и «Стив» для Y не работает, если я не добавляю метку, но работает для X без метки.

import UIKit

func TwoFer(_ X: String = "you ", Y: String = "one for me") -> String {
    return "one for \(X) " + "\(Y)"
}

TwoFer() // Prints one for you, one for me

TwoFer("Alice")  //Prints one for Alice, one for me

TwoFer("Alice", "Steve")  // ERROR: Missing argument label for Y:

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

Ответы [ 3 ]

4 голосов
/ 23 марта 2019

Вопрос вообще не относится к Optionals (в терминах Swift).

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

  • Подчеркивание означает , опускающий (внешний) метку параметра в вызове функции. Первая метка опущена, вторая нет.

Вы должны написать

TwoFer("Alice", Y:"Steve")

Если вы хотите опустить и вторую метку, что, кстати, не рекомендуется, вы должны объявить функцию

func TwoFer(_ X: String = "you ", _ Y: String = "one for me") -> String

Примечание:

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

func twoFer(_ x: String = "you ", _ y: String = "one for me") -> String
1 голос
/ 23 марта 2019

Просто для начала - в этом коде есть нет Необязательно. Необязательные обозначены с помощью ? и !. Примечание: функции должны соответствовать Верблюжий кейс для удобства чтения в Swift.

Цель подчеркивания

Рассмотрим вашу функцию:

func twoFer(_ x: String = "you ", y: String = "one for me") -> String {
    return "one for \(x) " + "\(y)"
}

Вызывается так:

twoFer("Alice", y: "Steve")

Подчеркивание - как и в других местах Swift - игнорировать значение или, в данном случае, метку параметра. Документацию по вашей проблеме можно найти здесь, в разделе Метки аргументов функций и Имена параметров .

Метки параметров

В качестве альтернативы ваша функция (тайно) выглядит следующим образом - обратите внимание на двойное y:

func twoFer(_ x: String = "you ", y y: String = "one for me") -> String {
    return "one for \(x) " + "\(y)"
}

Имя параметра y отображать не нужно - его можно упростить до одного y, но, как я уже сказал, это то, как оно «тайно» выглядит.

В этом случае вы вызываете функцию следующим образом:

twoFer("Alice", y: "Steve")

Как работает один параметр?

Вы создали параметр со значением по умолчанию , показанным =, например x: String = "you " - и он выглядел бы как x: String, если у вас не было значения по умолчанию. Значения по умолчанию просто избавляют от ненужных параметров.

Почему y не работает при инициализации?

Проще говоря, вы устанавливаете только имя параметра для x. Установите значение y следующим образом с подчеркиванием:

_ y: String = "one for me"
1 голос
/ 23 марта 2019
  • Оба X и Y имеют значения по умолчанию, поэтому вы можете вызывать метод без аргументов.
  • Подчеркивание _ в первом аргументе означает, что у него нет метки при внешнем вызове, но внутренне упоминается как X. Y упоминается как внутренне и внешне как Y, поэтому его необходимо явно указать.
TwoFer() // Uses the default values for X and Y
TwoFer("Alice") // "Alice" is X but does not require a label due to the underscore (`_`)
TwoFer("Alice", "Steve") // ERROR: Missing argument label for Y, as you pointed out
TwoFer("Alice", Y: "one for Steve") // "Alice" is X, "one for Steve" is Y

Документация Swift содержит больше об этом.

Функция print (_: separator: terminator :) не имеет метки для своего первого аргумента, а другие аргументы являются необязательными, поскольку имеют значение по умолчанию. Эти изменения в синтаксисе функции обсуждаются ниже в разделе «Ярлыки аргументов функций, имена параметров и значения параметров по умолчанию». https://docs.swift.org/swift-book/LanguageGuide/Functions.html

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