2016-05-22 6 views
-1

私はいくつかのチュートリアルを始めるコアデータを初めて使い、10のスコアがAppDelegateから保存され、コンソールから取り出して印刷することができます)。致命的なエラーを防ぐ方法:予期せぬことにnil wileアンラッピングオプション値

その後、別のVCでfetchrequestを使用して正常に保存されたデータを取得すると、次のエラーが表示されます。 致命的なエラー:オプションの値をアンラッピングしている間に予期せず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. 
} 

}

私が使用しているので...私は「エラーフェッチデータ」を取得するべきではありませんしましょうか?致命的なエラーを取得する代わりに?アプリケーションをロードするときにデータを取得することはできますが、同じコードを使用して別のVCでデータを取得しようとした場合はどうしたらいいですか?オプションの値アンラップながら

私は致命的なエラーに関連する他の質問を見てきましたがnilが見つかりました What does "fatal error: unexpectedly found nil while unwrapping an Optional value" mean?

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() 
    } 

} 

任意の助けいただければ幸いです!

答えて

0

問題がnilNSManagedObjectContext(宣言されていますが、値なし)である

が成功した場合に非オプションの配列を返し、あなたはエンティティがScores戻り常にScoresコアデータモデルから知ることになっているので、オブジェクトは、あなたが安全にNSManagedObjectサブクラス型キャストを避けるために、直接プロパティを使用を使用して

do { 
    scores = try managedObjectContext.executeFetchRequest(fetchRequest) as! [Scores] 

、明らかに書くことができます。オプションのバインドが必要なのは、プロパティgameScoreがオプションとして宣言されている場合のみです。しかし、あなたが

for result in results { 
     print("Your score is \(result.gameScore)") 
    } 
+0

@ vadianありがとう! – ThirtyKnots

1

letを使用する場合は、結果をIntとして生成できるかどうかを確認しています。その結果が最初に存在するかどうかを確認する必要があります。これを試してみてください:

for result in results { 
      if let gameScore = result.valueForKey("gameScore") { 
       print("Your score is \(gameScore as! Int)") 
      } 
     } 
+0

に次のコードを減らすことができるよりも非オプションのスコアのようなInt値は、より合理的であるため、エラーを返し

for result in results { if let gameScore = result.gameScore { print("Your score is \(gameScore)") } 

:結果を許可すれば... そうフェッチの結果に達する前にクラッシュしますが、次のエラーが発生します。 致命的なエラー:予期せぬエラーが発生しました。オプション値 をアンラップしていますが、次のものはありません:print( "Error fetching data") – ThirtyKnots

+0

doとcatchを取り出してください。あなたはそれを必要としません。それを削除すると助けになるかもしれない – penatheboss

0

だから私はそれがmanagedObjectContextために、以下のものを使用して、作業を取得するために管理しました:。 managedContext = AppDelegate()しましょうmanagedObjectContext

私は取得していない理由を私はまだ困惑していますキャッチで指定されたエラーですが、少なくとも今は動作しています。

ありがとうございました!定義executeFetchRequestことで

関連する問題