首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我得到错误“无法将类型(类)的值分配给类型UICollectionViewDelegate,UICollectionViewDataSource?”

为什么我得到错误“无法将类型(类)的值分配给类型UICollectionViewDelegate,UICollectionViewDataSource?”
EN

Stack Overflow用户
提问于 2019-09-19 18:56:59
回答 3查看 897关注 0票数 0

当我声明我的集合视图时,我得到了错误“无法将类型(类)的值赋给类型UICollectionViewDelegate,UICollectionViewDataSource":

代码语言:javascript
复制
let collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    return collectionView
}()

但是当我添加"lazy var“时,这个错误就消失了。我也不知道原因?有人能给我解释一下吗?

代码语言:javascript
复制
lazy var collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    return collectionView
}()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-19 19:42:04

代码语言:javascript
复制
   let collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    return collectionView
}()

在self初始化之前,您不能访问self。因为到目前为止还没有你的类的对象。实例方法和变量属于类的对象,而不属于类,即它们可以在创建类的对象后调用。所以它会给你一个错误。

代码语言:javascript
复制
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)的对象分配。

票数 3
EN

Stack Overflow用户

发布于 2019-09-19 19:25:34

闭包是在初始化期间调用的,因此您还不能使用self来访问实例的任何属性或方法。如果您需要访问self,则必须将字母替换为lazy var。

代码语言:javascript
复制
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 
}()
票数 1
EN

Stack Overflow用户

发布于 2019-09-19 19:29:15

添加惰性会强制iOS仅在第一次需要时检查collectionView的实例化。因此,它不会在编译时给你一个错误。在此之前,它给出了一个错误,因为初始化尚未完成,而您正在设置相同的属性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58009479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档