Сообщение об ошибке перехода с Swift 2.3 на Swift 3

Я пытался перенести проект Swift на последнюю версию Swift.

fileprivate lazy var _uploadedSurveysController: NSFetchedResultsController? = nil

Эта строка кода дает следующую ошибку.

Nil cannot initialize the specified type NSFetchedResultsController?

Xcode предлагает рекомендацию по исправлению, которая добавляет еще один вопросительный знак рядом с NSFetchedResultsController. Когда я говорю «да», он выдает ту же ошибку и предлагает исправление, добавляя еще один вопросительный знак.

Вот еще код

fileprivate var uploadedSurveysController: NSFetchedResultsController {
guard _uploadedSurveysController == nil else { return _uploadedSurveysController! }

 _uploadedSurveysController = NSFetchedResultsController(fetchRequest:     coreDataHelper.mailedAssetsFetchRequest(), managedObjectContext:   managedObjectContext, sectionNameKeyPath: "section2Identifier", cacheName: nil)

do {
  try _uploadedSurveysController!.performFetch()
} catch let error as NSError { Logger.sharedInstance.logMessage("\(#function)     Uploaded Surveys Fetching Error: \(error.userInfo)") }

 return _uploadedSurveysController!
}

Любая помощь могла бы быть полезна.

Просто чтобы вы знали. Я действительно новичок в Swift и пытаюсь обновить существующий проект с Swift 2.3 до 3.

Заранее спасибо. Ремзи.


person rsimsek    schedule 03.11.2016    source источник
comment
NSFetchedResultsController в Swift 3 теперь требуется объявление универсального типа. Можете ли вы включить еще код, где используется _uploadedSurveysController? (Инициализирован как не nil)   -  person Danoram    schedule 03.11.2016
comment
Просто попробуйте удалить '= nil', так как ваша переменная уже необязательна и может быть равна нулю или что-то в этом роде, поэтому всякий раз, когда вы собираетесь использовать, вы будете проверять наличие нуля перед использованием этого контроллера.   -  person Anni S    schedule 03.11.2016
comment
Привет, Анни, я удалил '= nil', но ничего не сделал, появились разные ошибки.   -  person rsimsek    schedule 03.11.2016


Ответы (3)


Я столкнулся с этим же сообщением об ошибке после обновления проекта Swift 2 до Swift 3. Ленивое создание экземпляров стало проще в Swift, поэтому больше нет необходимости в скрытом свойстве _variableName.

Если вы добавите ленивый атрибут вашего определения свойства, вы можете указать функциональный блок для запуска, чтобы инициализировать его, если свойство когда-либо будет установлено на nil.

fileprivate lazy var uploadedSurveysController: NSFetchedResultsController<NSFetchRequestResult> = {

    var fetchRequest<NSFetchRequestResult> = NSFetchedResultsController(fetchRequest: coreDataHelper.mailedAssetsFetchRequest(), managedObjectContext:   managedObjectContext, sectionNameKeyPath: "section2Identifier", cacheName: nil)

    do {
      try fetchedResultsController.performFetch()
    } catch let error as NSError { Logger.sharedInstance.logMessage("\(#function)     Uploaded Surveys Fetching Error: \(error.userInfo)") }

     return fetchedResultsContoller
}()

Я нашел хорошее описание отложенного создания экземпляров в Swift в запись в блоге Майка Басса

person Richard Hyde    schedule 22.11.2016

Вот еще код.

fileprivate var uploadedSurveysController: NSFetchedResultsController {
guard _uploadedSurveysController == nil else { return _uploadedSurveysController! }

_uploadedSurveysController = NSFetchedResultsController(fetchRequest: coreDataHelper.mailedAssetsFetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "section2Identifier", cacheName: nil)

do {
  try _uploadedSurveysController!.performFetch()
} catch let error as NSError { Logger.sharedInstance.logMessage("\(#function) Uploaded Surveys Fetching Error: \(error.userInfo)") }

return _uploadedSurveysController!

}

person rsimsek    schedule 03.11.2016
comment
Вы должны отредактировать исходный вопрос, чтобы добавить эту информацию. - person Stephen; 03.11.2016

Я думаю, это из-за обозначения lazy, которое следует правилам, отличным от стандартных свойств. Поскольку вы уже реализовали отложенное создание экземпляров самостоятельно, ключевое слово lazy не нужно (и в любом случае оно не предназначено для использования таким образом). Попробуйте удалить его и посмотрите, работает ли он.

person Bob    schedule 03.11.2016
comment
Привет, Боб, я пробовал, но все еще кажется той же ошибкой. Xcode добавляет еще один вопросительный знак, чтобы исправить это. - person rsimsek; 03.11.2016
comment
Кстати, я только что удалил ленивый, но оставил '= nil'. - person rsimsek; 03.11.2016