2016-10-08 2 views
-1

Я не могу это понять самостоятельно. Я извлекаю некоторые настройки, хранящиеся в Core Data, и печатаю эти настройки на некоторые UITextFields. Это отлично работает в другом VC в том же проекте, но здесь я получаю «неожиданно обнаруженный нуль при разворачивании необязательного значения».Swift 3.0 - Основные данные/Неожиданно найдено nil

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

enter image description here

Это текущий код Я до сих пор. Тем не менее то же самое сообщение об ошибке в XCode

func getSettingsFromCoreData() { 
    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "DeathMatchSettings") 
    do{ 
     let results = try context.fetch(request) 
     let managedObject = results as! [NSManagedObject] 
     let getDMSettings = managedObject[0] 

     guard let playerOne = getDMSettings.value(forKey: "playerOne") else { 
      return 
     } 
     print(playerOne) 
     txtPlayerOne.text = String(describing: playerOne) 

    }catch{ 
     fatalError("Error in retreiving settings from CoreData") 
    } 
} 

ответ

0

Player1 может быть ноль. Вы пытаетесь установить force downcast это значение, но это роковая ошибка в быстром. Используйте if let заявление для проверки значения:

if let playerOne = getDMSSettings.value(forKey: "playerOne") as? String { 
    print(playerOne) 
    txtPlayerOne.text = playerOne 
} 

Подробнее о типа литья в документации:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html

+0

Благодарим Вас за отзыв! Но все же я не могу решить проблему. Я изменил ваш код выше. Я не понимаю, почему это значение равно нулю. Так не должно быть? И значение печатается в консоли. – Frank

+0

Прочитайте некоторые документы о дополнительных значениях, это номер функции в Swift. Это автоматически не означает, что ваше значение равно нулю. Это может быть ноль. Поэтому для быстрой работы требуется развертывание дополнительного значения, чтобы иметь возможность работать с ним для вашей цели. – pedrouan

+0

Я много читал, но все же я не могу понять это. Странная часть заключается в том, что тот же самый код работает отлично в другом VC – Frank

0

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

do { 

    guard let playerOne = getDMSettings.value(forKey:"playerOne") else { 
     return 
    } 

    print(playerOne) 
    txtPlayerOne.text = playerOne 
} 
+0

Спасибо! Пробовал это тоже, по-прежнему та же проблема. переменная печатает отлично, чтобы консоль, но как только я попытаюсь использовать ее на «txtPlayerOne», она с ошибкой «неожиданно обнаружила нуль при распаковке необязательного значения» – Frank

+0

Можете ли вы обновить свой код выше? Если вы используете инструкцию охраны, а playerOne содержит необязательное значение, она должна выйти из функции перед ее печатью. – woogii

+0

код обновлен в основном столбце – Frank