

最近Swiftを勉強し始めた初心者です。  
DatePickerで設定した値をNSDate型で保存したいのですが、

[code]

    @IBAction func changed(sender: UIDatePicker) {
        let date2 = datepicker1.date
    
        let myDefault = NSUserDefaults.standardUserDefaults()
        myDefault.setObject(date2,forKey:"date")
        myDefault.synchronize()
    
    }
    
[/code]

のような記述で合っていますか？

また、保存した値を読み出したいのですが  
let userDefaults = NSUserDefaults.standardUserDefaults()  
let date2: NSDate = userDefaults.objectForKey("date")  
と記述しても  
「Cannot convert the expression's type 'NSString' to type
'String'」とエラーが出てしまいます。

どのようにして保存・読み出しすればいいのでしょうか？


CC BY-SA 3.0
2015-01-10T00:30:22.863
4350
2015-01-10T07:14:42.133
7278
question
swift
swiftでDatePickerの設定値を保存・読み出しする方法は？


NSDateではなくtimeIntervalSince1970に変換してから保存し、[NSDate
initEithTimeIntervalSince1970:]で読み込めばいいのではないでしょうか


CC BY-SA 3.0
2015-01-10T00:48:07.920
4351
2015-01-10T00:48:07.920
5750
4350
answer


保存の仕方はそれで合っています。

読み出す方法も合っているのですが、１点だけ、`objectForKey`メソッドは`AnyObject?`型を返すと定義されているので、戻り値を`NSDate`型で受けるならキャスト（型変換）が必要になります。

なので、  
`let date2: NSDate = userDefaults.objectForKey("date") as NSDate`

と書く必要があります。  
この場合、変数の型は型推論が働くので省略して下のように書けます。

`let date2 = userDefaults.objectForKey("date") as NSDate`

また、NSDate型にキャストしようとして中身がNSDate型と互換性がなかった場合、実行時エラーになるので、キャストに失敗した場合は何もしないようにするには以下のように`if〜let〜as?`と書きます。

[code]

    if let date2 = userDefaults.objectForKey("date") as? NSDate {
        println("date2: \(date2)")
    }
    
[/code]

この場合、もし`"date"`キーに対応する値が`NSDate`型でなかった場合は、実行時エラーにならず`date2`変数には`nil`が入るのでif文の中は処理されません。


CC BY-SA 3.0
2015-01-10T07:14:42.133
4363
2015-01-10T07:14:42.133
5519
4350
answer