В разных вариантах использования есть несколько нюансов, но обычно подчеркивание означает «игнорировать это».
При объявлении новой функции подчеркивание сообщает Swift, что параметр не должен иметь метки при вызове - это тот случай, который вы видите. Более полное объявление функции выглядит так:
func myFunc(label name: Int)
«label» - это метка аргумента, которая должна присутствовать при вызове функции. (А начиная с Swift 3, по умолчанию для всех аргументов требуются метки.) «Name» - это имя переменной для этого аргумента, которое вы используете внутри функции. Более короткая форма выглядит так:
func myFunc(name: Int)
Это ярлык, который позволяет использовать одно и то же слово как для метки внешнего аргумента, так и для имени внутреннего параметра. Это эквивалент func myFunc(name name: Int)
.
Если вы хотите, чтобы ваша функция могла быть вызвана без меток параметров, вы используете подчеркивание _
, чтобы метка была пустой / игнорировалась. (В этом случае вам необходимо указать внутреннее имя, если вы хотите использовать параметр.)
func myFunc(_ name: Int)
В операторе присваивания подчеркивание означает «ничего не присваивать». Вы можете использовать это, если хотите вызвать функцию, которая возвращает результат, но не заботится о возвращаемом значении.
_ = someFunction()
Или, как в статье, на которую вы ссылаетесь, игнорировать один элемент возвращаемого кортежа:
let (x, _) = someFunctionThatReturnsXandY()
Когда вы пишете замыкание, реализующее определенный тип функции, вы можете использовать подчеркивание, чтобы игнорировать определенные параметры.
PHPhotoLibrary.performChanges( { },
completionHandler: { success, _ in
if success { print("yay") }
})
Точно так же при объявлении функции, которая принимает протокол или переопределяет метод суперкласса, вы можете использовать _
для имен параметров, чтобы игнорировать параметры. Поскольку протокол / суперкласс также может определять, что параметр не имеет метки, вы можете даже получить два символа подчеркивания подряд.
class MyView: NSView {
override func mouseDown(with _: NSEvent) {
}
override func draw(_ _: NSRect) {
}
}
В некоторой степени связано с двумя последними стилями: при использовании конструкции управления потоком, которая связывает локальную переменную / константу, вы можете использовать _
, чтобы игнорировать ее. Например, если вы хотите повторить последовательность без необходимости доступа к ее членам:
for _ in 1...20 { // or 0..<20
// do something 20 times
}
Если вы привязываете случаи кортежа в операторе switch, подчеркивание может работать как подстановочный знак, как в этом примере (сокращено от одного в Язык программирования Swift):
switch somePoint {
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 работала, поэтому они используют __
, чтобы сохранить ее доступность, скрывая ее от большинства инструментов и документации.
21.09.2016