1

NSData を NSUserDefaults からカスタム オブジェクトにアーカイブ解除するためのコードを作成しようとしていますが、これまでのところ -

class func itemForKey<T>(key: String) -> T?
{
    let userDefaults = NSUserDefaults.standardUserDefaults()
    var value : T?

    if let dataObj = NSUserDefaults.standardUserDefaults().objectForKey(key) as? NSData
    {
        value = NSKeyedUnarchiver.unarchiveObjectWithData(dataObj) as? T
    }

    return value
}

残念ながら、ゴミを返します。アーカイブ解除の時点でクラス型の T を切り替えると、オブジェクトは正しく作成されます -

class func itemForKey<T>(key: String) -> T?
{
    let userDefaults = NSUserDefaults.standardUserDefaults()
    var value : T?

    if let dataObj = NSUserDefaults.standardUserDefaults().objectForKey(key) as? NSData
    {
        let obj = NSKeyedUnarchiver.unarchiveObjectWithData(dataObj) as? CustomObject // correct at this point

しかし、明らかにこれはジェネリックの目的を無効にします。

ヘルプなど、大歓迎です

4

3 に答える 3

0

修正しましたが、古いバージョンが機能しない理由がよくわかりません。新しいコードは -

class func itemForKey<T>(key: String) -> T?
{
    let userDefaults = NSUserDefaults.standardUserDefaults()
    var value : T?

    if let dataObj = NSUserDefaults.standardUserDefaults().objectForKey(key) as? NSData
    {
        if let obj: AnyObject = NSKeyedUnarchiver.unarchiveObjectWithData(dataObj)
        {
            value = obj as? T
        }
    }

    return value
}

これが機能し、最初のバージョンが機能しなかった理由を誰かが知っている場合は、聞いていただければ幸いです

于 2015-07-01T13:29:27.477 に答える