КОДЕКС
Что такое 0 и 1 доллар в Swift
Это как-то связано с деньгами?
$0
, $1
и т. Д. Представляют элементы коллекции при выполнении над ними действий.
Например, чтобы распечатать список чисел, вы можете использовать встроенную функцию forEach()
и $0
следующим образом:
let numbers = [1, 2, 3, 4, 5] numbers.forEach { print($0) }
Здесь $0
представляет каждое число в массиве за раз.
В этом руководстве вы узнаете, что означают эти переменные со знаком доллара и как с ними работать.
Заявление об ограничении ответственности: это сообщение содержит партнерские ссылки.
$ 0 и $ 1 в Swift
Прежде чем объяснять, что такое $0
и $1
, давайте рассмотрим пример.
Допустим, у вас есть массив чисел, и вы хотите их распечатать. Вы можете сделать это с помощью цикла for:
let numbers = [1, 2, 3, 4, 5] for number in numbers { print(number) }
Но есть еще одна альтернатива - использовать forEach
с $0
:
numbers.forEach { print($0) }
Давайте проверим код, чтобы увидеть, что он делает:
- Он берет массив
numbers
и вызываетforEach
для запуска кода для каждого элемента числа в массиве. - Метод
forEach
принимает закрытие, которое принимает числовой аргумент. В данном случае закрытие{ print($0) }
. Это закрытие вызывается для каждого числа в массиве один за другим. - При каждом вызове
$0
представляет другой числовой аргумент из массиваnumbers
.
Более подробное объяснение
Давайте создадим замыкание и присвоим его переменной с именем printer
. Это закрытие принимает число в качестве аргумента и выводит его:
var printer = { (n: Int) -> Void in print(n) } // Test calling printer closure on a number 3 for example: printer(3) // prints 3 - it works // Now, use printer to print numbers (from the previous example): numbers.forEach(printer) // prints 1, 2, 3, 4, 5
Вы можете упростить это замыкание: в конце вы используете это замыкание для печати массива целых чисел. Таким образом, Swift может автоматически определять тип аргумента (целое число) без его явного указания. Таким образом, printer
можно упростить до:
printer = { n in print(n) } // Test: printing numbers still works: numbers.forEach(printer) // prints 1, 2, 3, 4, 5
И вот здесь-то и появляются $0
: В Swift также можно опускать имя (имена) параметра в закрытии. При этом вы можете ссылаться на пропущенные аргументы с помощью $0, $1, $2
.
Давайте упростим закрытие printer
, опустив числовой параметр:
printer = { print($0) } // forEach accepts a closure: numbers.forEach(printer) // prints 1, 2, 3, 4, 5
Наконец, ничто не заставляет вас назначать printer
переменной с именем printer
. Вы можете использовать закрытие анонимно для достижения того же поведения:
numbers.forEach { print($0) } // prints 1, 2, 3, 4, 5
Это линия, которую вы видели ранее. Разве теперь это не кажется более интуитивным?
Попробуйте сами:
Создайте массив, в котором все числа в массиве numbers
возведены во вторую степень, используя метод map
.
let numbers = [1, 2, 3, 4, 5] let pow_nums = numbers.map { $0 * $0 } pow_nums.forEach { print($0) } // Prints 1, 4, 9, 16, 25
Если вы не уверены в закрытии, я предлагаю вам проверить: Swift - Closures Made Simple.
Заключение
Спасибо за прочтение.
Убедитесь, что вы подписаны на меня на Medium. Давайте подключимся и к Linkedin.
Станьте лучшим программистом
Тебе понравилась эта статья?
Станьте участником Medium.com, чтобы читать главные новости экспертов в этой области.
Отказ от ответственности: присоединяясь по предоставленной ссылке, я зарабатываю небольшую комиссию без каких-либо дополнительных затрат для вас :)