无法在swift中的懒惰属性中引用self

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)

我已经尝试重写代码并消除派生数据,再次构建但错误仍然存​​在.关于它为什么会发生的任何想法?

提前致谢

更新自动填充框:

在此输入图像描述

mat*_*att 1

UICollectionView?没有名为“frame”的成员

看到问号了吗?这意味着这是一个可选的。在解开包装之前,您无法向Optional发送任何消息。所以打开它:self.collectionView!.frame

编辑这之前有效,然后你的代码崩溃的原因是 Swift API 发生了变化。苹果经常这样做,所以你必须“随遇而安”。每次升级 Xcode 时,您都需要做好代码可能被破坏的准备。关于 UICollectionViewController 是否collectionView应该是可选的,他们已经改变了三次主意。即使现在我也不相信他们的答案是正确的。

进一步编辑显示自动完成功能有效:

在此输入图像描述