【问题标题】:Unarchiving custom objects in Swift using generics使用泛型在 Swift 中取消归档自定义对象
【发布时间】:2015-09-18 12:38:13
【问题描述】:

我正在尝试编写代码以将 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

但这显然违背了泛型的目的。

任何帮助等,非常感谢

【问题讨论】:

    标签: swift generics nskeyedunarchiver


    【解决方案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
    }
    

    【讨论】:

    • 对不起,实际上与我发布的内容相同,没有任何区别
    【解决方案2】:

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

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

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

    【讨论】:

    • 我就是这么称呼它的,只是在将其转换为正确类型的对象时失败了
    • 它也是该函数的精简版本(我只发布了相关的代码)-它旨在与所有 NSUserDefaults 函数、boolForKey、integerForKey、objectForKey 等一起使用。它的用处是如果我依赖来电者就会消失
    【解决方案3】:

    我修复了它,但我真的不明白为什么旧版本不起作用。新代码是 -

    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
    }
    

    如果有人知道为什么这行得通而第一个版本没有,我会很高兴听到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 2016-03-03
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多