質問: ### 前提・実現したいこと swift初心者です。 ご教授お願いします。 let Y=Int(userDefaults.stringForKey("year")!) let M=Int(userDefaults.stringForKey("month")!) let D=Int(userDefaults.stringForKey("day")!) 部分のuserDefaultsで保存した部分に下記のエラーが出てしまいました。 ### 発生している問題・エラーメッセージ ``` fatal error: unexpectedly found nil while unwrapping an Optional value ``` ### 該当のソースコード import Foundation import UIKit class ViewController2: UIViewController { let userDefaults=NSUserDefaults.standardUserDefaults() @IBOutlet weak var ttext: UITextView! @IBOutlet weak var sousint: UIButton! @IBOutlet weak var label2: UILabel! @IBOutlet weak var label3: UILabel! @IBAction func tapScreen(sender: UITapGestureRecognizer) { self.view.endEditing(true) } @IBAction func sousin(sender: AnyObject) { let date=NSDate() let calendar=NSCalendar.currentCalendar() let component=calendar.components([NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day,NSCalendarUnit.Hour,NSCalendarUnit.Minute],fromDate: date) userDefaults.setObject(component.year, forKey: "year") userDefaults.setObject(component.month, forKey: "month") userDefaults.setObject(component.day, forKey: "day") userDefaults.setObject(ttext.text, forKey: "Text") userDefaults.synchronize() let Y=Int(userDefaults.stringForKey("year")!) let M=Int(userDefaults.stringForKey("month")!) let D=Int(userDefaults.stringForKey("day")!) ttext.text="" label2.text="3ヶ月後にメッセージを送りました。" let A=M!+3 label3.text=String(Y)+"年"+String(A)+"月"+String(D)+"日にメッセージが届きます" ttext.hidden=true sousint.hidden=true sousint.enabled=false } override func viewDidLoad() { super.viewDidLoad() label2.text="3ヶ月後に届けるメッセージです" let Y=Int(userDefaults.stringForKey("year")!) let M=Int(userDefaults.stringForKey("month")!) let D=Int(userDefaults.stringForKey("day")!) ### 試したこと なんでエラーなのか見当もつかず質問させていただきました ### 補足情報(言語/FW/ツール等のバージョンなど) SWIFT
回答: viewDidLoad()内の `userDefaults.stringForKey("year")` がnilのため、これを「!」でunwrapしようとして 「unexpectedly found nil while unwrapping an Optional value」 というエラーが出たのだと思います。 sousin()というメソッドの中に `userDefaults.setObject(component.year, forKey: "year")` と"year"を保存する処理がありますが、これが呼ばれる前にviewDidLoadが 呼ばれたたため、viewDidLoad実行時点では"year"には何も入ってなかったのだと思います。