Как использовать сокращение (в :) в быстром - PullRequest
2 голосов
/ 30 мая 2020

Я читаю iOS 13 Основ программирования на Swift, дошел до части, касающейся reduce (), и я думаю, что понимаю это более или менее, но затем есть сокращение (в :) и этот фрагмент кода:

let nums = [1,2,3,4,5]
let result = nums.reduce(into: [[],[]]) { temp, i in 
    temp[i%2].append(i)
}
// result is now [[2,4],[1,3,5]]

Итак, этот код берет массив Int и разбивает его на 2 массива, четный и нечетный. Проблема в том, что я понятия не имею, что происходит внутри скобок {}.

В случае уменьшения первый параметр является первым из итерации, а затем предполагается, что закрытие обработает все элементы один за другим, похожим на map (), но более мощным (здесь одного l oop достаточно, чтобы получить два массива, но с map () мне понадобятся 2 цикла, согласно книге).

Я все равно не могу понять синтаксис здесь, особенно что означает «temp» и это использование «in». И как «append ()» добавляет значение в правильный массив ??

1 Ответ

1 голос
/ 30 мая 2020

Внутри замыкания «temp» - это формат результата, который равен [[] []], а «i» - каждое число. Как вы сказали, он обрабатывает все числа в al oop. Когда используется%, он возвращает остаток от деления, поэтому для нечетных чисел, таких как «1,3,5», он возвращает «1», а для четных чисел «0», что означает, что «temp» добавляет эти значения в массив. в этих соответствующих индексах.

Итак, если мы отлаживаем и заменяем переменные для констант, результаты будут:

temp[1].append(1) //1%2 = 1/2 left 1 [[][1]]
temp[0].append(2) //2%2 = 2/2 left 0 [[2][1]]
temp[1].append(3) //3%2 = 3/2 = 1 left 1 [[2][1,3]]
temp[0].append(4) //4%2 = 4/2 left 0 [[2,4][1,3]]
temp[1].append(5) //5%2 = 5/2 = 2 left 1 [[2,4][1,3,5]]

Согласно документации закрытие вызывается последовательно с инициализированным изменяемым накапливаемым значением который при истощении возвращается вызывающему.

...