Swift 3.0 - 核心数据 / 意外发现 nil
Posted
技术标签:
【中文标题】Swift 3.0 - 核心数据 / 意外发现 nil【英文标题】:Swift 3.0 - Core Data / Unexpectedly found nil 【发布时间】:2016-10-08 11:52:15 【问题描述】:我无法自己解决这个问题。我正在检索存储在 Core Data 中的一些设置,并将这些设置打印到一些 UITextFields。这在同一个项目的另一个 VC 中工作正常,但在这里我得到“在展开可选值时意外发现 nil”。
我 XCode 我可以看到值在那里?为什么我会遇到这个崩溃? 请参阅随附的屏幕截图。
这是我到现在为止的当前代码。 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")
【问题讨论】:
【参考方案1】:Player1
可以为 nil。您正试图将其强制向下转换 为一个值,但这在 swift 中是一个致命错误。使用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
【讨论】:
感谢您的反馈!但我仍然无法解决问题。我根据您上面的代码进行了更改。我不明白为什么这个值为零。不应该吗?并且该值可以很好地打印到控制台中。 请阅读一些关于可选值的文档,它是 Swift 中的第一大特性。这并不意味着您的价值为零。它可以为零。这就是为什么 swift 需要打开一个可选值以便能够根据您的目的对其进行操作。 我已经做了很多阅读,但我仍然无法弄清楚这一点。奇怪的是,完全相同的代码在另一个 VC 中运行良好【参考方案2】:你也可以使用guard语句来解开你的可选变量。只有当您确信变量具有非可选值时,才最好使用强制展开。
do
guard let playerOne = getDMSettings.value(forKey:"playerOne") else
return
print(playerOne)
txtPlayerOne.text = playerOne
【讨论】:
谢谢!这个也试过了,还是一样的问题。该变量可以很好地打印到控制台,但是一旦我尝试在“txtPlayerOne”上使用它,它就会出现“在展开可选值时意外发现 nil” 你能更新你上面的代码吗?如果你使用 guard 语句并且 playerOne 持有一个可选值,它应该在打印它的值之前退出一个函数。 是的,结果是一样的 如果你这样做了,你能在控制台屏幕上看到 playOne 变量的值吗?你程序哪一行崩溃了?如果你能分享你的项目,我会研究一下。 感谢您的帮助woogii,奇怪的是重新启动Xcode似乎已经解决了所有问题!现在我的原始代码有效,您建议的方式也是如此。可能是 beta 8.1 的东西。以上是关于Swift 3.0 - 核心数据 / 意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章
Swift 2.0:读取 HealthKit 心率数据 - 在展开 Optional 时意外发现 nil
Swift 2.0:读取 HealthKit 心率数据 - 在展开 Optional 时意外发现 nil