let collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectionView.delegate = self
collectionView.dataSource = self
return collectionView
}()
Вы не можете получить доступ к себе, пока оно не инициализировано.Так как нет объекта вашего класса до сих пор.Метод (ы) экземпляра и переменная принадлежат объекту класса, а не классу, т.е. их можно вызывать после создания объекта класса.Таким образом, это дает вам ошибку.
lazy var collectionView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
collectionView.delegate = self
collectionView.dataSource = self
return collectionView
}()
lazy var указывает на пропуск этой переменной во время инициализации.Если какая-либо переменная помечена как ленивая, она не будет выделена, пока не будет использована впервые.Вы пометили эту вычисленную переменную как ленивую.поэтому, когда бы она ни использовалась какой-либо функцией в классе, она всегда получает объект класса (self).