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

时间:2014-12-16 14:55:51

标签: ios xcode swift lazy-evaluation

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

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#>)

并且无法访问其他任何属性。

如果我尝试对它们进行硬编码,则会产生:

UICollectionView? does not have a member named 'frame'

上面的代码显示:

Extra argument 'width' in call

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

提前致谢

更新自动填充框:

enter image description here

1 个答案:

答案 0 :(得分:1)

  

UICollectionView?没有名为'frame'的成员

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

编辑以前的工作原理,然后你的代码坏了,是Swift API发生了变化。 Apple做了很多这样的事情,所以你必须“随心所欲”。每次升级Xcode时,您都需要准备好让代码中断。关于UICollectionViewController的collectionView是否应该是可选的,他们已经三次改变主意。我完全不相信他们的答案是正确的。

进一步修改显示自动完成功能:

enter image description here