В справочном разделе документации Apple есть много примеров такого рода вещей:
func runAction(_
action
: SKAction!)
Objective-C «эквивалент» этого:
- (void)runAction:(SKAction *)
action
Меня поражает, что, вероятно, важно, чтобы (в справочнике по Swift) после подчеркивания был пробел, а «действие» было написано курсивом.
Но я не могу понять, что это пытается передать. Так что, возможно, вопрос в том ... есть ли ссылка на условные обозначения, используемые в ссылках?
- вот страница, на которую я ссылаюсь в этой ссылке на использование подчеркивания: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction
Обновить
Swift 3 внес некоторые изменения в то, как имена и параметры параметров функций / методов и метки аргументов используются и именуются. Это имеет последствия для этого вопроса и его ответа. @Rickster делает потрясающую работу, отвечая на другой вопрос о _underscores в функциях, которые проясняют большую часть этого вопроса, здесь: Зачем мне нужны подчеркивания в swift?
источник
Ответы:
Оба ответа были правильными, но я хочу уточнить немного больше.
_
используется для изменения поведения имени внешнего параметра для методов .В разделе « Локальные и внешние имена параметров для методов » документации говорится:
С другой стороны, функции по умолчанию не имеют внешних имен параметров.
Например, у нас есть этот
foo()
метод, определенный в классеBar
:Когда вы звоните
foo()
, это называется какbar.foo("Hello", s2: "World")
.Но вы можете переопределить это поведение, используя
_
перед тем,s2
где оно объявлено.Затем, когда вы вызываете
foo
, он может быть просто назван какbar.foo("Hello", "World")
без имени второго параметра.Возвращаясь к вашему случаю,
runAction
это метод, потому что онSKNode
, очевидно , связан с типом . Таким образом, установка_
параметра beforeaction
позволяет вам звонитьrunAction
без внешнего имени.Обновление для Swift 2.0
Функция и метод теперь работают одинаково с точки зрения объявления имени локального и внешнего аргумента.
Функции теперь вызываются с использованием внешнего имени параметра по умолчанию, начиная со второго параметра. Это правило относится только к чистому коду Swift.
Таким образом, предоставляя
_
перед функцией функцию , вызывающая сторона не должна будет указывать имя внешнего параметра, так же, как вы делали бы для метода .источник
_
писать перед вторым параметром, ваш ответ достаточно однозначен; что если вfunc runAction(_action: SKAction!)
,_
перед первым параметром стоит перед или если вы напишете следующий код,func foo(_ s1: String) { // your code }
Xcode выдаст вам предупреждение, но есть много кода, какfunc bringSubviewToFront(_ view: UIView)
в ссылке, почему?_
первого параметра является посторонним. Я могу предположить, что дизайнеры считают, что этого достаточно для вашего кода и он не улучшает читабельность, а наоборот, это портит код. Итак, вы получите предупреждение. Ссылка имеет противоположную цель: она должна быть как можно более понятной - поэтому подчеркивание первого параметра упоминается для КАЖДОГО метода. Это все объяснило)-
первый параметр больше не является посторонним. Например:override func viewWillAppear(_ animated: Bool)
сигнализирует о том, что вызывающая сторона (код Objective C) не будет использовать метку параметраПодчеркивание - это общий токен, используемый для обозначения отброшенного значения.
В данном конкретном случае это означает, что функция будет вызываться
runAction(argument)
вместоrunAction(action:argument)
В других контекстах оно имеет другое подобное значение, например:
Это означает, что мы просто хотим выполнить блок 5 раз, и нам нет дела до индекса внутри блока.
В контексте:
Это означает, что нас не волнует, что является вторым элементом кортежа, только первым.
источник
let pi = 3.141_592_653_59
let pi = 3.1_4_15_92___63
Начиная с Swift 3 все метки аргументов являются обязательными по умолчанию .
Вы можете заставить IDE скрыть метку аргумента с помощью
_
.называется
foo(a: "abc")
иfoo2("abc")
Почему Apple использует это?
Вы можете видеть, что Apple использует его через API. Библиотеки Apple по-прежнему написаны на Objective-C (если нет, они в любом случае имеют одни и те же имена функций, которые были разработаны для синтаксиса Objective-C)
Функции вроде
applicationWillResignActive(_ application: UIApplication)
бы имеют избыточное имя параметраapplication
, поскольку в имени функции уже есть приложение .Ваш пример
func runAction(_ action: SKAction!)
будет называться без это_
метки , какrunAction(action:)
. Имя параметраaction
будет избыточным, так как оно уже есть в имени функции. Это цель и почему это там.источник
Идентификатор перед объявлением параметра определяет имя внешнего параметра. Это имя, которое должно быть предоставлено вызывающей стороной при вызове функции:
Swift предоставляет автоматическое внешнее имя для любого заданного по умолчанию параметра, если вы сами не предоставляете внешнее имя. Использование подчеркивания для имени внешнего параметра исключает из этого поведения:
Вы можете прочитать больше об этом поведении в разделе « Внешние имена для параметров со значениями по умолчанию» здесь .
источник
SK
дизайнеры не хотят, чтобы вы писалиaction
дважды, потому что «действие» уже является частью имени функции. Другими словами, они не хотят, чтобы вы писалиsprite.runAction(action:moveGroundSpritesForever)
. Цель внешних имен параметров состояла в том, чтобы сделать ваш код «читаемым как предложение»; использованиеaction
дважды приведет к поражению цели этого.foo.bar(param: 'fiddle')
иfoo.bar('fiddle')
ПРИМЕЧАНИЕ: только с одним аргументом это действительно не становится очевидным ... но с несколькими аргументами это становится очень актуальным:foo.bar(param1: 'fiddle', param2: 'dee')
vsfoo.bar('fiddle','dee')
Я думаю, что это вызывает соглашение в Swift, которое делает его более близким к target-c, что лучше соответствует соглашениям по какао. В objc вы не (внешне) называете свой первый параметр. Вместо этого по соглашению вы обычно включаете внешнее имя в последнюю часть имени метода следующим образом:
Чтобы сделать вызовы Swift API в соответствии с objc, вам нужно подавить имя внешнего параметра первого параметра.
источник
На самом деле, существует разница между реальным кодом, используемым для определения метода, и объявлением метода в документации Apple. Давайте UIControl «s - addTarget: Действие: forControlEvents: метод, например, реальный код:
Но в документах это выглядит так (обратите внимание _ перед целью):
В реальном коде _ используется, чтобы внешнее имя второго или последующего параметра не появлялось при вызове метода, тогда как в документах _ перед локальным именем параметра указывает, что при вызове метода или функции вы не должны предоставлять внешнее имя.
Нет внешнего имени, когда функция вызывается по умолчанию, если вы не предоставите свое собственное или не добавите # перед (без пробелов) локальным именем параметра, например, вот как мы используем dispatch_after :
И в документах это выглядит так (обратите внимание на три _):
Соглашение об объявлении функции точно такое же, как я описал для метода.
источник
Просто визуально.
Как вы можете видеть,
_
просто make пропускает локальное имя параметра или нет.источник