【问题标题】:Why I get error "cannot assign value of type (class) to type UICollectionViewDelegate, UICollectionViewDataSource?"为什么我收到错误“无法将类型(类)的值分配给类型 UICollectionViewDelegate、UICollectionViewDataSource?”
【发布时间】:2019-09-19 10:56:58
【问题描述】:

当我声明我的集合视图时,我收到错误“无法将类型(类)的值分配给类型 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
}()

【问题讨论】:

标签: ios swift uicollectionview lazy-initialization


【解决方案1】:
   let collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.delegate = self
    collectionView.dataSource = self
    return collectionView
}()

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

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)的对象。

【讨论】:

    【解决方案2】:

    在初始化过程中调用了闭包,因此您还不能使用 self 访问实例的任何属性或方法。如果您需要访问 self ,则必须将 let 替换为惰性 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 
    }()
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-10
        • 1970-01-01
        • 1970-01-01
        • 2017-11-23
        相关资源
        最近更新 更多