Когда не нужно инициализировать ленивую переменную с лямбда-выполнением? - PullRequest
0 голосов
/ 16 марта 2019

Как правило, многие быстрые разработчики инициализируют ленивые переменные с помощью лямбда-выполнения.Но я не могу понять, почему они используют лямбду, когда это одна строка вычислений.Чем отличаются следующие примеры кода?

var x = 7
var y = 9
lazy var z = x * y
var x = 7
var y = 9
lazy var z: Int = { 
    return x * y 
}()

Я новичок в swift, и с наивной точки зрения разница выглядит так:

  • первый образец вычисляет x * y немедленно , но инициализирует значение ленивым способом
  • второй образец вычисляет , а инициализирует ленивым способом.

Правильно ли это?


Этот вопрос не является дублированием В чем преимущество закрытия хранимого свойства Initialisation? , поскольку оно о ленивомвычисление.

1 Ответ

2 голосов
/ 16 марта 2019

Люди, которые делают это вторым способом, делают ошибку, вот и все.

Ошибка легкая. Иногда (1) необходим инициализатор define-and-call, а именно, когда вам нужно несколько операторов кода для получения начального значения переменной:

let timed : Bool = {
    if val == 1 {
        return true
    } else {
        return false
    }
}()

Иногда (2) требуется ленивая инициализация, а именно, чтобы упомянуть self во время инициализации свойства:

lazy var arrow : UIImage = self.arrowImage()

А иногда (3) вам нужно вместе, чтобы сделать обе вещи:

lazy var prog : UIProgressView = {
    let p = UIProgressView(progressViewStyle: .default)
    p.alpha = 0.7
    p.trackTintColor = UIColor.clear
    p.progressTintColor = UIColor.black
    p.frame = CGRect(x:0, y:0, width:self.view.bounds.size.width, height:20)
    p.progress = 1.0
    return p
}()

Так что по привычке, недопониманию или излишней осторожности прибегать к форме 3, когда на самом деле была только одна строка, и все, что вам нужно, это форма 2. Это простая ошибка и не приносит вреда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...