2015-09-09 32 views
5

我的应用通过归档具有属性的类的实例将设置保存到iOS设备上的文件。该类使用NSCoding协议,因此,我使用encodeWithCoder对这些属性进行编码。然后,我尝试使用诸如tempInt = decoder.decodeIntegerForKey("profileFlags") as Int如何从decodeIntegerForKey而不是0获得可选项?

这样的命令将这些文件读回到内存中,目前为止这种方法运行良好,但现在我需要能够存储其他属性并检索它们。本质上,这个存档对象的结构正在改变,但用户已经拥有旧结构的文件(属性更少)。如果用户具有新结构的文件(附加属性),那么我想阅读它们。如果不是,我希望能够执行代码来处理它并提供默认值。

我尝试使用不存在的键tempInt = decoder.decodeIntegerForKey("nonExistentKey") as Int,希望得到一个零值,但它返回一个零。不幸的是,这是我真的需要一个可选的地方,因为0是一个有效的值。

我能找到的最近的帮助文章是Swift: decodeObjectForKey crashes if key doesn't exist,但这似乎并不适用于此。这看起来像decodeObjectForKey返回一个可选的和decodeIntegerForKey返回一个Integer。

有关如何做到这一点的任何想法?

回答

7

您可以检查使用decoder.containsValueForKey("nonExistentKey")羯羊或不存在的实际值存在,并且仅当它是与decodeIntegerForKey提取它:

if decoder.containsValueForKey("nonExistentKey") { 
    let tempInt = decoder.decodeIntegerForKey("nonExistentKey") 
} 
+0

“如果编码的整数不适合默认的整数大小,则该方法产生一个NSRangeException。不幸的是,在Swift中很难处理这个问题。 – jtbandes

0

@ luk2302给你答案,但我想稍微调整一下语法并扩大它:

var tempInt: Int? 
let key = "profileFlags" 
let hasValue = decoder.containsValueForKey(key) 
tempInt = hasValue ? decoder.decodeIntegerForKey(key) : nil 

使用“三级运营商”,它具有相同的效果最后一条语句:

if hasValue 
{ 
    tempInt = decoder.decodeIntegerForKey(key) 
} 
else 
{ 
    tempInt = nil 
} 

...但全部在1行。在你习惯之前,它有点奇怪,但它是表达这种事物的一种非常简洁的方式。

0

您可以使用返回nil而不是零的decodeObjectForKey。你只需要按照下面的方法转换为Int:

decoder.decodeObjectForKey("profileFlags") as? Int 
相关问题