Использование имен функциональных параметров в Swift

В именах параметров Swift используются при вызове метода, за исключением первого параметра. Почему первое имя не используется?

Использование вариации из руководства Swift;

var count2: Int = 0
func incrementBy2(amount: Int, numberOfTimes times: Int) {
count2 += amount * times}

Это будет работать;

incrementBy2(2, numberOfTimes: 7)

Однако это дает мне "Посторонний аргумент" сумма "в вызове

incrementBy2(amount: 2, numberOfTimes: 7)

Есть ли причина для этого или это одна из тех вещей, которые "просто так, как есть"?

Ответ 1

Это должно следовать соглашению, к которому все мы использовали, начиная с Objective-C, где имя первого параметра объединяется с именем метода. Вот пример:

- (void)incrementByAmount:(NSInteger)amount
            numberOfTimes:(NSInteger)times
{
    // stuff
}

Вы можете вызвать метод, например:

[self incrementByAmount:2 numberOfTimes:7];

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

func incrementByAmount(amount: Int, numberOfTimes: Int) {
    // same stuff in Swift
}

И вызовите метод вроде:

incrementByAmount(2, numberOfTimes: 7)

Если вы не хотите использовать это соглашение, Swift дает вам возможность быть более явным и определять отдельные внутренние и внешние имена параметров, например:

func incrementByAmount(incrementBy amount: Int, numberOfTimes: Int) {
    // same stuff in Swift
    // access `amount` at this scope.
}

Вы можете вызвать метод следующим образом:

incrementByAmount(incrementBy: 2, numberOfTimes: 7)

Ответ 2

В вашем примере вы не задаете имя для первого параметра. У вас есть только имя переменной.

Попробуйте следующее:

func incrementBy2(amount am: Int, numberOfTimes times: Int) {
}

Итак, вы можете назвать его

incrementBy2(amount: 0, numberOfTimes: 0)

и am будет именем переменной внутри функции. amount будет внешним именем.

Если вы хотите иметь такое же внешнее имя и переменную, вы можете попробовать следующее:

func incrementBy2(amount amount: Int, numberOfTimes times: Int) {
}

И по-прежнему называйте

incrementBy2(amount: 0, numberOfTimes: 0)

Дополнительная информация Имена параметров параметров и указания названий внешних имен параметров на Apple Язык быстрого программирования

Ответ 3

Методы в Swift очень похожи на их аналоги в Objective-C. Как и в Objective-C, имя метода в Swift обычно относится к первому параметру метода с использованием предлога например, с или для, как видно из метода incrementBy из предшествующий пример класса Counter. Использование предлога позволяет метод, который следует читать как предложение при его вызове. Свифт делает это установленное соглашение об именовании методов легко писать с помощью другой подход по умолчанию для параметров метода, чем он использует для функциональные параметры.

В частности, Swift дает первое имя параметра в методе имя локального параметра по умолчанию и дает второй и последующий имена параметров как локальные, так и внешние имена параметров по умолчанию. Это соглашение соответствует типичному соглашению об именах и вызовах, которое вы будут знакомы с написанием методов Objective-C и экспресс-вызовы без необходимости определять ваш параметр имена.

Отрывок из: Apple Inc. "Быстрый язык программирования". интерактивные книги. https://itun.es/ru/jEUH0.l

Ответ 4

Чтобы обновить этот ответ для последней версии Swift, использование # для принудительного использования функции с первым именованным параметром извне было удалено с языка. Чтобы указать имена внешних параметров, теперь просто просто отделяйте внешнее имя от внутреннего имени пробелом. # ранее использовался для указания параметра с тем же именем как внутри, так и снаружи, но теперь вам нужно удвоить имя параметра в определении функции, чтобы достичь этого:

var count2: Int = 0
func incrementBy2(amount amount: Int, numberOfTimes times: Int) {
  count2 += amount * times
}
incrementBy2(amount: 2, numberOfTimes: 7) // result is 14

Вы можете также различать имена для ясности:

var count2: Int = 0
func incrementBy2(theValue amount: Int, numberOfTimes times: Int) {
  count2 += amount * times
  }
incrementBy2(theValue: 2, numberOfTimes: 7)

Или просто сделайте это Objective-C и дайте понять, что должен сделать первый параметр:

var count2: Int = 0
func incrementBy2TheValue(amount: Int, numberOfTimes times: Int) {
  count2 += amount * times
}
incrementBy2TheValue(2, numberOfTimes: 7)

Я не уверен, как люди относятся к цифрам в именах функций. Но я понимаю, что это всего лишь пример.

Ответ 5

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

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

Кстати, в объекте C сигнатура метода - это имя метода плюс все именованные параметры, например:

- (void) addUser:(User *)user toArray:(NSMutableArray *)array

отличается от:

- (void) addUser:(User *)user toDict:(NSMutableDictionary *)dict

в значительной степени, как на других языках (С#, Java и т.д.):

void addUser(User user, Array array)

отличается от:

void addUser(User user, Dictionary dict)