为什么会出现错误“无法将类型(类)的值分配给UICollectionViewDelegate,UICollectionViewDataSource类型?”

时间:2019-09-19 10:56:58

标签: ios swift uicollectionview lazy-initialization

当我声明集合视图时,出现错误“无法将类型(类)的值分配给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 个答案:

答案 0 :(得分:3)

   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表示在初始化时跳过此变量。如果有任何标记为惰性的变量,则在第一次使用它之前不会分配它。您已将此计算变量标记为惰性。因此,每当要由类中的任何函数使用它时,它将始终获取分配的类(自我)的对象。

答案 1 :(得分:1)

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

try
        {
            url2 = getServletContext().getInitParameter("url");
            driver = getServletContext().getInitParameter("name");
            username = getServletContext().getInitParameter("username");
            password = getServletContext().getInitParameter("password");
            Class.forName("org.postgresql.Driver").newInstance();

            Connection connection= DriverManager.getConnection("url","username","password");

            PreparedStatement preparestatement=connection.prepareStatement("SELECT * FROM STORESETUPLOGIN WHERE username=? password=?");        
              preparestatement.setString(1,username);
               preparestatement.setString(2,password);
              ResultSet resultset=preparestatement.executeQuery();         
              status=resultset.next();
             if(status==true) {
                 RequestDispatcher rd=request.getRequestDispatcher("/NewFile.jsp");
                 rd.forward(request,response);
             }
             else{
                 out.print("Oops!!!Sorry username or password error");  
                    RequestDispatcher rd=request.getRequestDispatcher("/index.jsp");  
                    rd.include(request,response);
             }
        }catch(SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e){System.out.println(e);
        e.printStackTrace();
        }   

答案 2 :(得分:0)

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