Вопрос: Нельзя ссылаться на себя из ленивого имущества в быстром


Недавно я наткнулся на что-то странное в своем коде, у меня есть программирование в одном проекте в течение нескольких дней, но внезапно я попытался создать ленивое свойство с помощью этого кода:

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.(<#NSObject#>)

и не может получить доступ ни к одному из других свойств.

Если я пытаюсь их жестко закодировать, он производит:

UICollectionView? does not have a member named 'frame'

И приведенный выше код показывает:

Extra argument 'width' in call

Я уже пытался переписать код и исключить производные данные, построить снова, но ошибка сохраняется. Любые идеи относительно того, почему это могло произойти?

заранее спасибо

Обновление окна автозаполнения:

enter image description here


5


источник


Ответы:


UICollectionView? не имеет члена с именем 'frame'

См. Вопросительный знак? Это означает, что это необязательно. Вы не можете отправлять какие-либо сообщения в Необязательный, пока не развернете его. Так разверните его: self.collectionView!.frame

РЕДАКТИРОВАТЬ  Причина, по которой это работало раньше, а затем ваш код сломался, заключается в том, что Swift API изменился. Apple делает это много, поэтому вам нужно «бросить кулаки». Вы должны быть готовы к разрыву кода при каждом обновлении Xcode. Три раза они передумали о том, работает ли UICollectionViewController collectionView должен быть необязательным или нет. И я совсем не убежден, что их ответ верен и сейчас.

Дальнейшие изменения  Показывая, что автозаполнение работает:

enter image description here


1