Есть несколько нюансов для разных вариантов использования, но, как правило, подчеркивание означает «игнорировать это».
При объявлении новой функции подчеркивание говорит Swift, что у параметра не должно быть метки при вызове - это тот случай, который вы видите. Более полное объявление функции выглядит так:
func myFunc(label name: Int) // call it like myFunc(label: 3)
«метка» является меткой аргумента и должна присутствовать при вызове функции. (А после Swift 3 по умолчанию требуются метки для всех аргументов.) «Name» - это имя переменной для того аргумента, который вы используете внутри функции. Более короткая форма выглядит так:
func myFunc(name: Int) // call it like myFunc(name: 3)
Это ярлык, который позволяет использовать одно и то же слово как для метки внешнего аргумента, так и для имени внутреннего параметра. Это эквивалентно func myFunc(name name: Int)
.
Если вы хотите, чтобы ваша функция могла вызываться без меток параметров, используйте подчеркивание, _
чтобы метка была ничем / игнорировалась. (В этом случае вы должны указать внутреннее имя, если хотите использовать этот параметр.)
func myFunc(_ name: Int) // call it like myFunc(3)
В операторе присваивания подчеркивание означает «ничего не присваивать». Вы можете использовать это, если хотите вызвать функцию, которая возвращает результат, но не заботится о возвращаемом значении.
_ = someFunction()
Или, как в статье, на которую вы ссылаетесь, игнорировать один элемент возвращаемого кортежа:
let (x, _) = someFunctionThatReturnsXandY()
Когда вы пишете замыкание, которое реализует некоторый определенный тип функции, вы можете использовать подчеркивание, чтобы игнорировать определенные параметры.
PHPhotoLibrary.performChanges( { /* some changes */ },
completionHandler: { success, _ in // don't care about error
if success { print("yay") }
})
Аналогично, при объявлении функции, которая принимает протокол или переопределяет метод суперкласса, вы можете использовать _
для имен параметров игнорирование параметров. Поскольку протокол / суперкласс может также определять, что параметр не имеет метки, вы можете даже получить два подчеркивания подряд.
class MyView: NSView {
override func mouseDown(with _: NSEvent) {
// don't care about event, do same thing for every mouse down
}
override func draw(_ _: NSRect) {
// don't care about dirty rect, always redraw the whole view
}
}
Несколько связано с двумя последними стилями: при использовании конструкции управления потоком, которая связывает локальную переменную / константу, вы можете использовать ее _
для игнорирования. Например, если вы хотите перебрать последовательность без необходимости доступа к ее членам:
for _ in 1...20 { // or 0..<20
// do something 20 times
}
Если вы связываете регистры кортежей в операторе switch, подчеркивание может работать как подстановочный знак, как в этом примере (сокращено от одного в языке программирования Swift ):
switch somePoint { // somePoint is an (Int, Int) tuple
case (0, 0):
print("(0, 0) is at the origin")
case (_, 0):
print("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
print("(0, \(somePoint.1)) is on the y-axis")
default:
print("(\(somePoint.0), \(somePoint.1)) isn't on an axis")
}
Одна последняя вещь , которая не совсем связаны, но я включу так (как отмечено комментариев), кажется , не вести людей здесь: подчеркивание в качестве идентификатора - например var _foo
, func do_the_thing()
, struct Stuff_
- значит ничего , в частности , к Swift, но имеет несколько применений среди программистов.
Подчеркивание в имени - выбор стиля, но не предпочтение в сообществе Swift, которое имеет строгие соглашения об использовании UpperCamelCase для типов и lowerCamelCase для всех других символов.
Префикс или суффикс имени символа с подчеркиванием - это соглашение о стиле, исторически использовавшееся для того, чтобы отличать символы частного / внутреннего использования от экспортированного API. Тем не менее, Swift имеет модификаторы доступа для этого, так что это соглашение обычно считается неидиоматическим в Swift.
Несколько символов с префиксами с двойным подчеркиванием ( func __foo()
) скрываются в глубинах SDK Apple: это символы (Obj) C, импортированные в Swift с использованием NS_REFINED_FOR_SWIFT
атрибута. Apple использует это, когда они хотят сделать «более Swifty» версию (Obj) C API - например, чтобы сделать метод, независимый от типа, в универсальный метод . Им нужно использовать импортированный API, чтобы заставить улучшенную версию Swift работать, поэтому они используют ее, __
чтобы держать ее доступной, скрывая ее от большинства инструментов и документации.
В дополнение к принятому ответу, один из случаев использования
_
, когда вам нужно написать длинное число в кодеБолее читаемый номер
Это не просто для чтения человеком:
Вы можете добавить
_
число, чтобы сделать его более читабельным:источник
Начиная с Swift 3, указание имен параметров при вызове функций стало обязательным - даже для первого. Таким образом, поскольку это может вызвать огромные проблемы с кодом, написанным на swift 2, вы можете использовать подчеркивание в объявлении, чтобы избежать необходимости записывать имя параметра при вызове. Таким образом, в этом случае говорится: «не волнует имя внешнего параметра». Где имя внешнего параметра - это то, что вы называете параметрами вне функции (при вызове), а не внутри. Эти внешние имена параметров называются метками аргументов. http://ericasadun.com/2016/02/09/the-trouble-with-argument-labels-some-allts/ ... посмотрите, как параметру присвоено два имени? Ну, во-первых, это то, где подчеркивание происходит. Надеюсь, это поможет, и спросите, если все еще в замешательстве.
источник
_
Является заполнителем для названия параметра. В вашем примере вы вызываете их по-разному, во второй функции вам нужно написать имя параметраa: 1
.Соглашение об именах функций Swift есть
funcName(param1:param2:)
, и_
для создания имени функции требуется заполнитель.Во имя, имя
В то время как второй
источник