How to prevent fatal error: unexpectedly found nil wile unwrapping an Optional value
How to prevent fatal error: unexpectedly found nil wile unwrapping an Optional value
所以我是核心数据的新手,开始做一些教程并获得了一个非常基本的设置,其中从 AppDelegate 保存了 10 个分数并且工作正常(我能够从控制台获取和打印)。
然后当我想在另一个 VC 中使用 fetchrequest 来检索已成功保存的数据时,出现以下错误:
致命错误:在展开 Optional 值时意外发现 nil。
这是检索数据的代码:
import Foundation
import CoreData
import UIKit
class testVC: UIViewController {
var managedObjectContext: NSManagedObjectContext!
var scores = [Scores]()
@IBOutlet weak var retrieveDataLabel: UIButton!
@IBOutlet weak var saveLabel: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func retrieveData(sender: AnyObject) {
let fetchRequest = NSFetchRequest(entityName: "Scores")
do {
if let results = try managedObjectContext.executeFetchRequest(fetchRequest) as? [Scores]{
scores = results
for result in results {
if let gameScore = result.valueForKey("gameScore") as? Int{
print("Your score is \(gameScore)")
}
}
}
}catch{
print("Error fetching data")
}}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
因为我正在使用 if let .. 我不应该得到 "Error fetching data" 吗?而不是得到致命错误?为什么我可以在加载应用程序时检索数据,但当我尝试使用相同的代码在不同的 VC 中检索数据时却不能?
我查看了与 fatal error found nil while unwrapping an optional value 相关的其他问题:
fatal error: unexpectedly found nil while unwrapping an Optional value
似乎我基本上是在尝试检索不存在的东西,但数据确实已保存,我可以在启动应用程序时在控制台中检索它。使用相同的获取请求,我希望在加载应用程序和检索数据时获得相同的结果,但事实并非如此。
我在这里错过了什么?感觉它应该是非常基本的,但由于某种原因,在尝试了 2 天后无法让它工作。
用于保存和检索数据的应用委托代码:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
//addTestData()
let fetchRequest = NSFetchRequest(entityName: "Scores")
do {
if let results = try managedObjectContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]{
for result in results {
if let gameScore = result.valueForKey("gameScore") as? Int{
print("Your score is \(gameScore)")
}
}
}
}catch{
print("Error fetching data")
}
return true
}
func addTestData(){
guard let entity = NSEntityDescription.entityForName("Scores", inManagedObjectContext: managedObjectContext) else{
fatalError("Could not find entity description")
}
for i in 1...10{
let score = Scores(entity: entity, insertIntoManagedObjectContext: managedObjectContext)
score.gameScore = i
}
do {
try managedObjectContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
}
}
如有任何帮助,我们将不胜感激!
当您使用 if let 时,您正在检查是否可以将结果作为 Int。你想先看看那个结果是否存在。试试这个:
for result in results {
if let gameScore = result.valueForKey("gameScore") {
print("Your score is \(gameScore as! Int)")
}
}
所以我确实设法让它工作,对 managedObjectContext 使用以下内容:
让 managedContext = AppDelegate().managedObjectContext
我仍然很困惑为什么我没有得到 catch 中指定的错误,但至少它现在可以工作了。
感谢您的回答!
问题是 nil
NSManagedObjectContext
(已声明但没有值)
根据定义 executeFetchRequest
returns 一个成功的非可选数组,因为你应该从核心数据模型中知道实体 Scores
returns 总是Scores
个您可以安全写入的对象
do {
scores = try managedObjectContext.executeFetchRequest(fetchRequest) as! [Scores]
并且显然使用 NSManagedObject
子类直接使用 属性 以避免类型转换。仅当 属性 gameScore
声明为可选时才需要可选绑定。
for result in results {
if let gameScore = result.gameScore {
print("Your score is \(gameScore)")
}
然而,对于像分数这样的 Int
值,非可选值比您可以将代码减少到
更合理
for result in results {
print("Your score is \(result.gameScore)")
}
所以我是核心数据的新手,开始做一些教程并获得了一个非常基本的设置,其中从 AppDelegate 保存了 10 个分数并且工作正常(我能够从控制台获取和打印)。
然后当我想在另一个 VC 中使用 fetchrequest 来检索已成功保存的数据时,出现以下错误: 致命错误:在展开 Optional 值时意外发现 nil。 这是检索数据的代码:
import Foundation
import CoreData
import UIKit
class testVC: UIViewController {
var managedObjectContext: NSManagedObjectContext!
var scores = [Scores]()
@IBOutlet weak var retrieveDataLabel: UIButton!
@IBOutlet weak var saveLabel: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func retrieveData(sender: AnyObject) {
let fetchRequest = NSFetchRequest(entityName: "Scores")
do {
if let results = try managedObjectContext.executeFetchRequest(fetchRequest) as? [Scores]{
scores = results
for result in results {
if let gameScore = result.valueForKey("gameScore") as? Int{
print("Your score is \(gameScore)")
}
}
}
}catch{
print("Error fetching data")
}}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
因为我正在使用 if let .. 我不应该得到 "Error fetching data" 吗?而不是得到致命错误?为什么我可以在加载应用程序时检索数据,但当我尝试使用相同的代码在不同的 VC 中检索数据时却不能?
我查看了与 fatal error found nil while unwrapping an optional value 相关的其他问题:
fatal error: unexpectedly found nil while unwrapping an Optional value 似乎我基本上是在尝试检索不存在的东西,但数据确实已保存,我可以在启动应用程序时在控制台中检索它。使用相同的获取请求,我希望在加载应用程序和检索数据时获得相同的结果,但事实并非如此。
我在这里错过了什么?感觉它应该是非常基本的,但由于某种原因,在尝试了 2 天后无法让它工作。
用于保存和检索数据的应用委托代码:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
//addTestData()
let fetchRequest = NSFetchRequest(entityName: "Scores")
do {
if let results = try managedObjectContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]{
for result in results {
if let gameScore = result.valueForKey("gameScore") as? Int{
print("Your score is \(gameScore)")
}
}
}
}catch{
print("Error fetching data")
}
return true
}
func addTestData(){
guard let entity = NSEntityDescription.entityForName("Scores", inManagedObjectContext: managedObjectContext) else{
fatalError("Could not find entity description")
}
for i in 1...10{
let score = Scores(entity: entity, insertIntoManagedObjectContext: managedObjectContext)
score.gameScore = i
}
do {
try managedObjectContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
}
}
如有任何帮助,我们将不胜感激!
当您使用 if let 时,您正在检查是否可以将结果作为 Int。你想先看看那个结果是否存在。试试这个:
for result in results {
if let gameScore = result.valueForKey("gameScore") {
print("Your score is \(gameScore as! Int)")
}
}
所以我确实设法让它工作,对 managedObjectContext 使用以下内容: 让 managedContext = AppDelegate().managedObjectContext
我仍然很困惑为什么我没有得到 catch 中指定的错误,但至少它现在可以工作了。
感谢您的回答!
问题是 nil
NSManagedObjectContext
(已声明但没有值)
根据定义 executeFetchRequest
returns 一个成功的非可选数组,因为你应该从核心数据模型中知道实体 Scores
returns 总是Scores
个您可以安全写入的对象
do {
scores = try managedObjectContext.executeFetchRequest(fetchRequest) as! [Scores]
并且显然使用 NSManagedObject
子类直接使用 属性 以避免类型转换。仅当 属性 gameScore
声明为可选时才需要可选绑定。
for result in results {
if let gameScore = result.gameScore {
print("Your score is \(gameScore)")
}
然而,对于像分数这样的 Int
值,非可选值比您可以将代码减少到
for result in results {
print("Your score is \(result.gameScore)")
}