Какова природа свойства класса при объявлении с помощью «= {} ()» в Swift? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть класс Swift из некоторого примера кода, и в нем есть свойство captureSession, объявленное так:

private lazy var captureSession: AVCaptureSession = {
    let session = AVCaptureSession()

    guard
        let backCamera = AVCaptureDevice.default(for: .video),
        let input = try? AVCaptureDeviceInput(device: backCamera)
        else { return session }
    session.addInput(input)
    return session
}()

Я не думаю, что captureSession является вычисляемымсобственность, и при этом это не закрытие.Тогда что это?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Ленивые свойства позволяют вам создавать определенные части типа Swift, когда это необходимо, а не делать это как часть процесса инициализации.Это может быть полезно во избежание необязательных действий или для повышения производительности, когда создание определенных свойств может быть дорогостоящим.Это также может помочь сохранить чистоту инициализаторов, так как вы можете отложить некоторые настройки ваших типов до более поздних этапов их жизненного цикла.

Проще говоря, экземпляр captureSession не будет создан, пока вы не получите к нему доступв первый раз и после создания экземпляра каждый раз будет возвращаться один и тот же экземпляр.

Преимущество этого подхода заключается в том, что вы можете хранить как объявление свойства, так и его настройку в одном месте.

Вот хорошийстатья о ленивой инициализации: Использование ленивых свойств в Swift

0 голосов
/ 22 ноября 2018

captureSession является отложенным свойством, но ={}() не относится к отложенной инициализации.Это Setting a Default Property Value with a Closure or Function.Это пример.

let titleLabel: UILabel = {
    let label = UILabel()
    label.numberOfLines = 0
    label.textColor = UIColor.textColor
    label.font = UIFont(name: "HelveticaNeue-Medium", size: 14)
    return label
}()

Более подробную информацию вы можете найти в конце этого документа .

0 голосов
/ 22 ноября 2018

Это Ленивая инициализация .Это часто используется, когда начальное значение является относительно дорогим для создания.Таким образом, вы создаете ценность, когда уверены, что она вам нужна.Поэтому captureSession будет создан при первом обращении к нему, а затем сохранен в переменной captureSession.

Синтаксис ={}() отображает замыкание (анонимная функция), которое вызывается при обращении к вашему свойству.Этот тип возврата замыкания равен AVCaptureSession.

Другими словами: используя lazy var a: SomeType = { ... }() вы откладываете создание объекта a до тех пор, пока оно вам действительно не понадобится.Когда вы обращаетесь к нему в первый раз, переменная a получит результат закрытия.


Мне нравится объяснение, написанное здесь , Официальная документация также может быть полезным.

...