2017-07-03 11 views
-1

これは一般的なエラーですが、ここに投稿するのはよくあることですが、根本的に同じであっても何をしているのかわかりません。私はスイフトには新しく、ちょうど私の道を見つけようとしています、ありがとう。Swift:Unknown error - アンラッピング中に予期せずnilが見つかりました。オプション値

初めてアプリケーションを開くときに、MYSQLデータベースから読み込んだブログリーダーアプリが意図したとおりに機能し、選択したブログに従うことができます。ブログ/セルに従うとKeyArchiverを使ってUser Defaultsに保存されますが、ホームボタンをタップしてメモリからアプリをクリアしてアプリを再度開くとクラッシュします。私はブレークポイントを設定しているため、間違った

何かが私のloadUserDefaultsに起こっている、それは私が、私は任意ですが、なぜそれは私がsaveUserDefaultsでそれを保存した場合はnil戻って来て/クラッシュさを持って知っている。このラインでself.followedIdentifiers = Set(UserDefaults.standard.stringArray(forKey: "followedID")!)

をクラッシュします。それは貯蓄ではありませんか?それとも正しくロードしていないのですか?

エラーがコードこの

fatal error: unexpectedly found nil while unwrapping an Optional value

です:これはこれは私が保存しFile Managerを使用するすべてのブログのオブジェクトを処理Blog.swiftとNSCoding

class Blog: NSObject, NSCoding { 

var blogName: String 
var blogStatus1: String 
var blogStatus2: String 
var blogURL: String 
var blogID: String 
var blogType: String 
var blogDate: String 
var blogPop: String 


private init (name: String,status1: String,status2: String,url: String,id: String,type: String,date: String,pop: String) { 
    blogName = name 
    blogStatus1 = status1 
    blogStatus2 = status2 
    blogURL = url 
    blogID = id 
    blogType = type 
    blogDate = date 
    blogPop = pop 
    super.init() 
} 

convenience init?(jsonObject: [String:Any]) { 

    guard let bID = jsonObject["id"] as? String, 
     let bName = jsonObject["blogName"] as? String, 
     let bStatus1 = jsonObject["blogStatus1"] as? String, 
     let bStatus2 = jsonObject["blogStatus2"] as? String, 
     let bURL = jsonObject["blogURL"] as? String, 
     let bType = jsonObject["blogType"] as? String, 
     let bDate = jsonObject["blogDate"] as? String, 
     let bPop = jsonObject["blogPop"] as? String 

     else { 
      print("Error: (Creating Blog Object)") 
      return nil 
    } 

    self.init(name: bName, status1: bStatus1, status2: bStatus2, url: bURL, id: bID, type: bType, date: bDate, pop: bPop) 

} 

convenience required init?(coder aDecoder: NSCoder) { 
    guard let blogName = aDecoder.decodeObject(forKey: "blogName") as? String, 
     let blogStatus1 = aDecoder.decodeObject(forKey: "blogStatus1") as? String, 
     let blogStatus2 = aDecoder.decodeObject(forKey: "blogStatus2") as? String, 
     let blogURL = aDecoder.decodeObject(forKey: "blogURL") as? String, 
     let blogID = aDecoder.decodeObject(forKey: "blogID") as? String, 
     let blogType = aDecoder.decodeObject(forKey: "blogType") as? String, 
     let blogDate = aDecoder.decodeObject(forKey: "blogDate") as? String, 
     let blogPop = aDecoder.decodeObject(forKey: "blogPop") as? String else { 
      print("Error: (Creating Blog Object)") 
      return nil 
    } 
    self.init(name: blogName, status1: blogStatus1, status2: blogStatus2, url: blogURL, id: blogID, type: blogType, date: blogDate, pop: blogPop) 
} 

func encode(with aCoder: NSCoder) { 
    aCoder.encode(blogName, forKey: "blogName") 
    aCoder.encode(blogStatus1, forKey: "blogStatus1") 
    aCoder.encode(blogStatus2, forKey: "blogStatus2") 
    aCoder.encode(blogURL, forKey: "blogURL") 
    aCoder.encode(blogID, forKey: "blogID") 
    aCoder.encode(blogType, forKey: "blogType") 
    aCoder.encode(blogDate, forKey: "blogDate") 
    aCoder.encode(blogPop, forKey: "blogPop") 
} 
} 
+1

をロードするために使用@GuyKogus、@ Paulw11 & @MartinR

私のオブジェクトを保存するために使用し

NSKeyedArchiver.archiveRootObject(myObject, toFile: filePath) 

にあなたが読むことを試行し*データ*を保存しているようです*文字列配列として返す* –

+1

なぜ 'self.followedIdentifiers'に2回割り当てますか?最初の割り当ては意味があり、2番目の割り当ては意味がありません。 –

+0

@MartinRだから、 'data'として読み返すのですか、' data'ではなく 'string array'で保存するのですか? 2番目のコメントのために、私がなぜそれをしたのかわからないので、 'self.followedIdentifiers'の代わりに' myFollowedList'を使用しますか? – BroSimple

答えて

0

あるMainController.swift

var mainArray = [Blog]() 
var followedArray = [Blog]() 
var filteredArray = [Blog]() 
var followedIdentifiers = Set<String>() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Receiving Data from Server 
    retrieveDataFromServer() 

    // NSCoding - Unarchiving Data (followedID) 
    loadUserDefaults() 
} 

// NSCoding: Archiving UserDefaults 
func saveUserDefaults() { 

    // Saving to UserDefaults 
    let encodedData = NSKeyedArchiver.archivedData(withRootObject: self.followedIdentifiers) 
    UserDefaults.standard.setValue(encodedData, forKey: "followedID") 
    UserDefaults.standard.synchronize() 
} 

// NSCoding: Unarchiving UserDefaults 
func loadUserDefaults() { // --- Crash is Here --- 

    // Unarchiving Data 
    if let data = UserDefaults.standard.data(forKey: "followedID"), let myFollowedList = NSKeyedUnarchiver.unarchiveObject(with: data) as? Set<String> { 

     self.followedIdentifiers = myFollowedList 
     self.followedIdentifiers = Set(UserDefaults.standard.stringArray(forKey: "followedID")!) // CRASH 

    } else { 
     print("Error/ Empty: (Loading UserDefaults (followedID))") 
    } 
} 

// Retrieving Data from Server 
func retrieveDataFromServer() { 

    let getDataURL = "http://example.com/receiving.php" 
    let url: NSURL = NSURL(string: getDataURL)! 

    do { 
     let data: Data = try Data(contentsOf: url as URL) 
     let jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! NSMutableArray 

     // Clear the arrays 
     self.followedArray = [Blog]() 
     self.mainArray = [Blog]() 

     // Looping through jsonArray 
     for jsonObject in jsonArray { 

      if let blog = Blog(jsonObject:jsonObject as! [String : Any]) { 

       // Check if identifiers match 
       if followedIdentifiers.contains(blog.blogID) { 
        self.followedArray.append(blog) 
       } else { 
        self.mainArray.append(blog) 
       } 
      } 
     } 
    } catch { 
     print("Error: (Retrieving Data)") 
    } 
    myTableView.reloadData() 
} 

です私のアーカイブされた配列とそれは最良の選択だったので、簡単に簡単です。 Swift 3を使用してください。クレジット私のオブジェクト

if let myFollowedList = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? Set<String> { 

    myObject = myFollowedList 
} 
関連する問題