Что такое: В Свифт говорит мне?


что означает одинокое подчеркивание в определениях функций?

например map(_:)

Я понимаю, что при определении функции я могу сделать:

func myFunc(_ string: String) { ... }

Я бы тогда назвал это myFunc(_:) вместо myFunc(_string:), т. е. целенаправленно скрывает имя параметра?

3   51   2015-06-16 22:04:11

3 ответа:

Swift нуждается в соглашении для того, чтобы сказать, что такое имя функции, включая не только само имя функции (перед скобками), но и внешние имена параметров. Условность заключается в том, что за именами следуют двоеточия. Вот объявление функции (в Swift 2.0):

func myFunc(param1 param1:String, param2:String, param3:String) {}

и вот имя этой функции:

myFunc(param1:param2:param3:)

В реальной жизни, однако, вполне возможно (даже вероятно), что один или несколько параметров не будет воплощать какие-либо имя. Таким образом, нам нужен заполнитель для этого имени. Подчеркивание является этим заполнителем-так же, как подчеркивание является символом в объявлении, подавляющим экстернализацию имени. Итак, вот еще одно объявление функции (в Swift 2.0):

func myFunc2(param1:String, _ param2:String, _ param3:String) {}

и вот имя этой функции:

myFunc2(_:_:_:)

[здесь важна спецификация Swift 2.0. В Swift 2.0, первое имя param всегда не externalized по умолчанию, и другие имена параметров are externalized по умолчанию. В Swift 1.2 и ранее правила экстернализации зависели от того, где появилась декларация, что было излишне непоследовательным и запутанным.]

The _ используется для определения того, что параметр не имеет имени

если у вас есть несколько _ он утверждает, что вам не нужно называть параметры в вызове функции

func myFunc(name:String, _ age:String){
}

myFunc(“Milo", "I'm a really old wizard")

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

myFunc(“Milo”, age: "I'm a really old wizard")

The _ не требуется в вызовах функций. Он просто используется, чтобы указать, что что-то не имеет имени.

что касается того, как вы будете ссылаться на свою функцию, вы не будете необходимо передать любое имя для вызова функции.
Но поскольку вы также не определяете тип параметра, это кажется мне недопустимым примером (по крайней мере, он не работает в xCode 7 с swift 2.0)

Edit:
Начиная с swift 3.0

myFunc(name: “Milo”, age: "I'm a really old wizard")

следует использовать

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

например,

func myFunc(myString string: String) { ... }

и

func myFunc(_ string: String) { ... }

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

myFunc(myString: "hi")

и

myFunc("hi")

Итак, чтобы идентифицировать функцию, мы включаем внешнюю метку для каждого параметра, где ': 'указывает, что параметр должен быть предоставлен - например yourFunc(arg1:arg2:) примет 2 аргумента.

если внешняя метка не используется, мы помещаем подчеркивание ('_').

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

myFunc(myString:) и myFunc(_:)