Почему я получаю сообщение об ошибке «не удается присвоить значение типа (класса) типу UICollectionViewDelegate, UICollectionViewDataSource?» - PullRequest
0 голосов
/ 19 сентября 2019

Когда я объявляю представление своей коллекции, я получаю сообщение об ошибке "не могу присвоить значение типа (класса) типу UICollectionViewDelegate, UICollectionViewDataSource":

let collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    return collectionView
}()

Но когда я добавляю "lazy var", ошибка исчезает,Не знаю почему?Может кто-нибудь объяснить мне?

lazy var collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    return collectionView
}()

Ответы [ 3 ]

3 голосов
/ 19 сентября 2019
   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).

1 голос
/ 19 сентября 2019

То, что замыкание вызывается во время инициализации, поэтому вы не можете использовать self для доступа к каким-либо свойствам или методам экземпляра.Если вам нужно получить доступ к self, вы должны заменить let на lazy var.

let collectionView: UICollectionView = {
   let layout = UICollectionViewFlowLayout()
   let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
   collectionView.delegate = self // You cannot use
   collectionView.dataSource = self // You cannot use
   return collectionView 
}()
0 голосов
/ 19 сентября 2019

добавление lazy заставляет iOS проверять наличие экземпляра collectionView только тогда, когда это необходимо в первый раз.Поэтому он не дает вам ошибку при компиляции.До этого он выдавал ошибку, потому что инициализация еще не была завершена, и вы настраивали свойства для нее.

...