Ios Can';t在swift中从惰性属性中引用self

Ios Can';t在swift中从惰性属性中引用self,ios,xcode,swift,lazy-evaluation,Ios,Xcode,Swift,Lazy Evaluation,我最近在我的代码中偶然发现了一些奇怪的东西,我在同一个项目中编程了几天,但突然我试图用这段代码创建一个惰性属性: import UIKit class CategoryViewController: UICollectionViewController { lazy var searchController: UISearchController = { let searchController = UISearchController(searchResultsControll

我最近在我的代码中偶然发现了一些奇怪的东西,我在同一个项目中编程了几天,但突然我试图用这段代码创建一个惰性属性:

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
    }()
}
现在,每次我尝试从惰性块中引用self时,它都会产生以下结果:

self.(<#NSObject#>)
上面的代码显示:

Extra argument 'width' in call
我已经尝试重写代码并删除派生数据,重新构建,但错误仍然存在。你知道为什么会这样吗

提前谢谢

更新自动完成框:

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

看到问号了吗?这意味着这是可选的。在打开可选邮件之前,无法将任何邮件发送到该邮件。所以打开它:
self.collectionView!。帧

编辑之前之所以能这样做,然后代码就坏了,是因为Swift API发生了变化。苹果经常这样做,所以你必须“随机应变”。每次升级Xcode时,您都需要准备好让代码中断。关于UICollectionViewController的
collectionView
是否应该是可选的,他们已经改变了三次想法。即使现在,我也不相信他们的答案是正确的

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


@DánielNagy我的意思是,您只能向Optionals发送可选消息(如特殊的可选
地图),您永远没有理由这样做。并且可选项没有属性。包裹在里面的东西才有属性;这就是为什么你必须打开它@如果你不明白什么是可选的,请看我的回答:@DánielNagy是的,你必须打开代理。如果委托被键入为
MyDelegateType?
,则这是可选的,在您打开它之前,您无法向它发送消息。可能只是剩余的缓存。正如我在这里解释的那样,清除缓存:然后所有代码都将以完全相同的方式中断。:)好吧,正如你现在预测的那样,它破坏了我的代码,至少我现在明白为什么了。唯一的问题是self.()一直存在,而autocompletes只允许在autocomplete中找不到任何属性
Extra argument 'width' in call