Вывод: [Optional(2), nil, Optional(2), Optional(2), nil], затем 3 и 6. Внутренний nil учитывается как элемент массива.
Какой вывод получим в примере №20
Вывод: [Optional(2), nil, Optional(2), Optional(2), nil], затем 3 и 6. Внутренний nil учитывается как элемент массива.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В данном примере рассматривается массив, который может содержать как вложенные массивы, так и nil. Необходимо понять, какие значения будут напечатаны после выполнения трёх последовательных операторов print. Обратите внимание на различия между методами map, compactMap и flatMap при работе с опциональными элементами.
let matrix = [[1, 2], nil, [3, 4], [nil, 5], nil]
print(matrix.map { $0?.count })
print(matrix.compactMap { $0 }.count)
print(matrix.compactMap { $0 }.flatMap { $0 }.count)
Ответ
Вывод: [Optional(2), nil, Optional(2), Optional(2), nil], затем 3 и 6. Внутренний nil учитывается как элемент массива.
map сохраняет пять внешних позиций и возвращает optional-длину каждого непустого массива. compactMap { $0 } удаляет только внешние nil, поэтому остаётся три массива: [1,2], [3,4], [nil,5]. Последующий flatMap снимает один уровень вложенности и даёт шесть элементов, включая внутренний nil. Чтобы получить пять чисел, после объединения нужно ещё раз удалить nil через compactMap.