КОДЕКС

Что такое 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, чтобы читать главные новости экспертов в этой области.

Отказ от ответственности: присоединяясь по предоставленной ссылке, я зарабатываю небольшую комиссию без каких-либо дополнительных затрат для вас :)

Вы можете найти что-то интересное







использованная литература