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

1

尝试这个

class func itemForKey<T>(key: String) -> T?
{
    if let dataObj = NSUserDefaults.standardUserDefaults().objectForKey(key) as? NSData {
        return NSKeyedUnarchiver.unarchiveObjectWithData(dataObj) as? T
    }

    return nil
}
于 2015-07-01T11:49:36.633 回答
0

您不必推断方法内部的类,您也可以这样做,以便调用该方法的人,

let item: MyClass? = SomeObject.itemForKey("SomeKey")

注意:该项目是用 MyClass 的类型声明的,所以编译器会从你的方法中正确推断出 T,

于 2015-07-01T12:02:05.603 回答
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 回答