Jak*_*tiz 5 xcode lazy-evaluation ios swift
我最近在我的代码中偶然发现了一些奇怪的东西,我在同一个项目中编程了几天,但突然间我尝试用这段代码创建一个懒惰的属性:
import UIKit
class CategoryViewController: UICollectionViewController {
lazy var searchController: UISearchController = {
let searchController = UISearchController(searchResultsController: nil)
searchController.searchBar.frame = CGRect(x: 0, y: 0, width: CGRectGetWidth(self.collectionView.frame), height: 44)
return searchController
}()
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我尝试在惰性块中引用self时,它会产生以下结果:
self.(<#NSObject#>)
Run Code Online (Sandbox Code Playgroud)
并且无法访问其他任何属性.
如果我尝试对它们进行硬编码,它会产生:
UICollectionView? does not have a member named 'frame'
Run Code Online (Sandbox Code Playgroud)
并且上面的代码显示:
Extra argument 'width' in call
Run Code Online (Sandbox Code Playgroud)
我已经尝试重写代码并消除派生数据,再次构建但错误仍然存在.关于它为什么会发生的任何想法?
提前致谢
更新自动填充框:

UICollectionView?没有名为“frame”的成员
看到问号了吗?这意味着这是一个可选的。在解开包装之前,您无法向Optional发送任何消息。所以打开它:self.collectionView!.frame
编辑这之前有效,然后你的代码崩溃的原因是 Swift API 发生了变化。苹果经常这样做,所以你必须“随遇而安”。每次升级 Xcode 时,您都需要做好代码可能被破坏的准备。关于 UICollectionViewController 是否collectionView应该是可选的,他们已经改变了三次主意。即使现在我也不相信他们的答案是正确的。
进一步编辑显示自动完成功能有效:
