Люди, которые делают это вторым способом, делают ошибку, вот и все.
Ошибка легкая. Иногда (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. Это простая ошибка и не приносит вреда.