2017-05-03 7 views
-4

アンラッピングするときに、どこにnilがあるかを調べようとしています。ここに私が持っているコードがあります。致命的なエラーが発見された行はである:アンラップ中にnilを見つけることができますか?

第一のファイル:

date = dateFormatter().date(from: dictionary[kDATE] as! String)! 

第二のファイル:

self.allLists.append(ShoppingList.init(dictionary: currentList)) 

これはshoppingList.swiftファイルからのものであり、関数がで呼び出されコントローラ

import Foundation 
import Firebase 

class ShoppingList{ 
    let name: String 
    var totalPrice: Float 
    var totalItems: Int 
    var id: String 
    var date: Date 
    var ownerId: String 

    init(_name: String, _totalPrice: Float = 0, _id: String = "") { 
     name = _name 
     totalPrice = _totalPrice 
     totalItems = 0 
     id = _id 
     date = Date() 
     ownerId = "1234" 
    } 

    //creates shopping list item from this dictionary 

    init(dictionary: NSDictionary) { 

     name = dictionary[kNAME] as! String 
     totalPrice = dictionary[kTOTALPRICE] as! Float 
     totalItems = dictionary[kTOTALITEMS] as! Int 
     id = dictionary[kSHOPPINGLISTID] as! String 
     date = dateFormatter().date(from: dictionary[kDATE] as! String)! 
     ownerId = dictionary[kOWNERID] as! String 
    } 

    func dictionaryFromItem(item: ShoppingList) -> NSDictionary { 

     return NSDictionary(objects: [item.name, item.totalPrice, item.totalItems, item.id, dateFormatter().string(from: item.date), item.ownerId], forKeys: [kNAME as NSCopying, kTOTALPRICE as NSCopying, kTOTALITEMS as NSCopying, kSHOPPINGLISTID as NSCopying, kDATE as NSCopying, kOWNERID as NSCopying]) 

    } 

ここでは、コントローラです。

import UIKit 
import KRProgressHUD 


class AllListsViewController: UIViewController, UITableViewDataSource,UITableViewDelegate{ 


    @IBOutlet weak var tableView: UITableView! 

    var allLists:[ShoppingList] = [] 
    var nameTextField: UITextField! 

    override func viewDidLoad() { 

     super.viewDidLoad() 
     loadLists() 

    } 

    //MARK: TableView DataSource 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return allLists.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 

     let shoppingList = allLists[indexPath.row] 

     cell.textLabel?.text = shoppingList.name 

     return cell 
    } 

    //MARK: IBActions 


    @IBAction func addBarButonItemPressed(_ sender: Any) { 

     let alertController = UIAlertController(title: "Create Shopping List", message: "Enter the shopping list name", preferredStyle: .alert) 

     alertController.addTextField{ (nameTextField) in 

      nameTextField.placeholder = "Name" 
      self.nameTextField = nameTextField 
     } 

     let cancelAction = UIAlertAction(title: "Cancel", style: .cancel){ (action) in 


     } 

     let saveAction = UIAlertAction(title: "Save", style: .default){ (action) in 

      if self.nameTextField.text != ""{ 

       self.createShoppingList() 

      }else{ 

       KRProgressHUD.showWarning(message: "Name is empty!") 
      } 

     } 

     alertController.addAction(cancelAction) 
     alertController.addAction(saveAction) 

     self.present(alertController,animated: true, completion:nil) 


    } 

    //MARK: LoadList 


    func loadLists(){ 

     //.values has all the info of the child 

     firebase.child(kSHOPPINGLIST).child("1234").observe(.value, with: { 
      snapshot in 

      self.allLists.removeAll() 

      //if we actually received smthing from firebase 

      if snapshot.exists(){ 

       let sorted = ((snapshot.value as! NSDictionary).allValues as NSArray).sortedArray(using: [NSSortDescriptor(key: kDATE,ascending: false)]) 

       for list in sorted { 

        let currentList = list as! NSDictionary 

        self.allLists.append(ShoppingList.init(dictionary: currentList)) 

       } 

      } else { 

       print("no snapshot") 
      } 

      self.tableView.reloadData() 

     }) 


    } 


    //MARK: Helper functions 

    func createShoppingList(){ 


     let shoppingList = ShoppingList(_name: nameTextField.text!) 

     shoppingList.saveItemInBackground(shoppingList: shoppingList){ (error) in 

      if error != nil{ 

       KRProgressHUD.showError(message: "Error creating shopping list") 
       return 

      } 
     } 
    } 
} 

また、データフォーマッタは別のファイルの小さな関数です。

import Foundation 
import UIKit 

private let dateFormat = "yyyyMMDDHHmmss" 

func dateFormatter() -> DateFormatter { 

    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = dateFormat 

    return dateFormatter 

} 
+0

関連するコードを投稿してください。 – rmaddy

+0

そして、私が調べてみてくださいhttp://stackoverflow.com/questions/32170456/what-does-fatal-error-unexpectedly-found-nil-while-unwrapping-an-optional-valu – rmaddy

+1

"私はどこにアンラッピングしないときは「なし」いいえ、あなたは試していません。あなたのコード中の感嘆符( '!')は、 "please crash"を意味します。それがまさに何が起こったのか不平を言うことはできません。 '無し 'を見つけるためにあなたがしなければならないことは、あなた自身を探すことです。感嘆符は使用しないでください!あなたのダウンキャスティングとアンラッピングのOptionalsをすべて実行し、実際に何が起こっているかをデバッガで確認します。 – matt

答えて

1

だから、あなたは意気消沈余儀なくされていますし、このライン上の強制オプションアンラップ:

date = dateFormatter().date(from: dictionary[kDATE] as! String)! 

あなたの辞書は文字列を返していない、または辞書から出てくる文字列がされていませんか日付として処理することができます。私の推測では、日付はしばしばepochとして保存されるため、最初の問題です。

上記の行の代わりにこれを試してください。上にブレークポイントを追加し、ステップを実行します。

最初のif-letで失敗した場合、戻り値は文字列ではありません。 2番目に失敗した場合、日付フォーマッタはフォーマットを読み取ることができません。

最初の印刷では、どのような型をキャストするのかという手掛かりが得られます.2番目の見出しは、書式の修正に役立ちます。

は、力がアンラップするときに注意する

optionalVar! 

またはダウンキャストのためにしてみてください。

unknownType as! Type 

値がゼロにならない方法がないことが絶対に確かであるときは、実際には「力を使用する」必要があります。

関連する問題