lazy
променя начина, по който се обработва масивът. Когато lazy
не се използва, filter
обработва целия масив и съхранява резултатите в нов масив. Когато се използва lazy
, стойностите в последователността или колекцията се произвеждат при поискване от функциите надолу по веригата. Стойностите не се съхраняват в масив; те просто се произвеждат, когато е необходимо.
Помислете за този модифициран пример, в който използвах reduce
вместо count
, за да можем да отпечатаме какво се случва:
Не използвам lazy
:
В този случай всички елементи първо ще бъдат филтрирани, преди да се преброи нещо.
[1, 2, 3, -1, -2].filter({ print("filtered one"); return $0 > 0 })
.reduce(0) { (total, elem) -> Int in print("counted one"); return total + 1 }
filtered one
filtered one
filtered one
filtered one
filtered one
counted one
counted one
counted one
Използване на lazy
:
В този случай reduce
иска елемент за преброяване и filter
ще работи, докато намери такъв, след това reduce
ще поиска друг и filter
ще работи, докато намери друг.
[1, 2, 3, -1, -2].lazy.filter({ print("filtered one"); return $0 > 0 })
.reduce(0) { (total, elem) -> Int in print("counted one"); return total + 1 }
filtered one
counted one
filtered one
counted one
filtered one
counted one
filtered one
filtered one
Кога да използвате lazy
:
опция-щракването върху lazy
дава това обяснение:
![изскачащ прозорец за мързеливи в Xcode](https://i.stack.imgur.com/Mm0AI.png)
От Дискусията за lazy
:
Използвайте мързеливото свойство при верижни операции:
за предотвратяване на междинните операции от разпределяне на хранилище
or
когато имате нужда само от част от крайната колекция, за да избегнете ненужни изчисления
Бих добавил и трети:
когато искате процесите надолу по веригата да започнат по-рано и да не се налага да чакате процесите нагоре по веригата да свършат цялата си работа първи
Така например бихте искали да използвате lazy
преди filter
, ако търсите първия положителен Int
, защото търсенето ще спре веднага щом намерите такъв и това ще спести filter
от необходимостта да филтрира целия масив и ще спестете необходимостта да отделяте място за филтрирания масив.
За 3-та точка си представете, че имате програма, която показва прости числа в диапазона 1...10_000_000
, използвайки filter
в този диапазон. Бихте предпочели да покажете простите числа, както сте ги намерили, отколкото да чакате да ги изчислите всички, преди да покажете нещо.
person
vacawama
schedule
19.08.2018
lazy
инициализацията обикновено се използва за тежки елементи като UIKit елементи. Не съм виждал да се използва с масиви. - person Rakesha Shastri   schedule 19.08.2018