使用泛型在Swift中取消归档自定义对象

时间:2015-07-01 11:22:13

标签: swift generics nskeyedunarchiver

我试图编写代码来将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

但显然这违背了仿制药的目的。

任何帮助等,非常感谢

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

你不必在方法中推断出类,也可以这样调用方法的那个,

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

注意:该项目使用MyClass类型声明,因此编译器将正确推断出方法中的T,

答案 2 :(得分: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
}

如果有人知道为什么会这样做&amp;第一个版本没有,我很高兴听到