Есть несколько нюансов для разных вариантов использования, но, как правило, подчеркивание означает «игнорировать это».
При объявлении новой функции подчеркивание говорит 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 работать, поэтому они используют ее, __
чтобы держать ее доступной, скрывая ее от большинства инструментов и документации.