Почему swift требует имен параметров, если он также требует порядка аргументов? - PullRequest
0 голосов
/ 11 октября 2019

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

Пример:

Если мы определим функцию makeDog следующим образом:

makeDog(legs: int, name: String)->Dog{}

Тогда она должна быть вызвана так:

makeDog(legs: 4, name: "fido")

И она не может вызываться так (ошибка компилятора):

makeDog(name: "fido", legs: 4)

Примечание после записи: даже описание тега StackOverflow для именованных параметров гласит:

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

Ответы [ 4 ]

1 голос
/ 11 октября 2019

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

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

Так что порядок важен, а название - для уточнения.

Представьте себе функцию sorted на[Int]:

[1, 2].sorted(by: <#(Int, Int) throws -> Bool#>)

как узнать, какой из этих двух аргументов должен быть справа или слева от оператора <? Порядок их!

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

[1, 2].sorted { first, second -> Bool in
    return first < second
}

Но, как вы знаете, вы могли бы избавиться от имен и просто использовать номер заказа:

[1, 2].sorted {
    return $0 < $1
}

, как вы, возможно, знаете, это < является инфиксной функцией в Swift вот так:

func <(lhs: Int, rhs: Int)->Bool { return lhs < rhs }

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

[1, 2].sorted(by: <)

У его аргументов есть имена, но сколькораз вы их используете? Ноль! Так как же компилятор знает, какой использовать при передаче?

сигнатура функции!

тип аргументов, их порядок и тип (типы) возвращаемых значений функции

1 голос
/ 11 октября 2019

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

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

Так, например,:

func f(p1 param1:String = "one", p2 param2:Int = 2) {}

f(p1:"hey", p2:42)
f(p1:"hey")
f(p2:42)
f()
// but not:
// f(p2:42, p1:"hey")

Метка p1: не означает: «Эй, компилятор, это параметр param1».

Это означает: «Эй, звонящий, если вы включитеэтот параметр (который должен стоять первым, если вы включите оба), вы должны пометить как p1:. "

0 голосов
/ 11 октября 2019

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

func foo(aString: String = "", anInt: Int = 42, aFloat: Float = 10) {}

foo(aFloat: 50) // Skip the params where you want to use the defaults.
0 голосов
/ 11 октября 2019

Существует несколько причин, по которым Swift делает это.

Одна из них - это влияние Objective-C на разработчиков языка. Именованные параметры - это особенность языка Objective-C (и других).

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

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

Подробнее об особенностях функций Swift можно прочитать здесь: Функции

...