当我声明集合视图时,出现错误“无法将类型(类)的值分配给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
}()
答案 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时检查其实例化。因此,它不会在编译时给您错误。在此之前,由于初始化尚未完成,而您正在同一属性上设置属性,因此出现了错误。