Есть ли способ O (1) удалить значения nil из коллекции Swift? - PullRequest
2 голосов
/ 22 апреля 2020

Я думал о пользовательском Collection, что-то вроде:

for i in [1, 2, nil].nilValuesRemoved() {
     print(i)
}

будет печатать:

1
2

Фактический вызов .nilValuesRemoved() будет O(1), вид так же .reverse() работает. Это было бы возможно?

1 Ответ

2 голосов
/ 22 апреля 2020

Это ленивый compactMap:

for i in ([1, 2, nil].lazy.compactMap{$0}) {
     print(i)
}

Это создает LazyMapSequence в O (1).

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


Вполне возможно, что название этого вопроса смущает некоторых читателей, хотя вопрос довольно ясен. Чтобы быть в явном виде: на самом деле итерации по результату все равно будет O (n), так же как итерации по результату .reverse() является O (n), даже если вызов .reverse() является O (1).

...