NSNumber充当可选项,即使它未声明为一个

时间:2015-03-03 00:52:26

标签: swift

我有一个我正在快速字典中存储的数字。我正在使用NSNumber,因为我必须序列化为JSON。我很困惑为什么下面的第5行不起作用而第6行不起作用。 currentCt似乎认为它是可选的,但是,在第1行它未在Dictionary<String, NSNumber>()中被声明为可选的任何想法为什么?

另外,我不确定为什么桥接不允许自动添加Int和NSNumber,我必须使用Int(currentCt!)。再次,任何想法都非常感激。

var activeMinDic = Dictionary<String, NSNumber>()
activeMinDic["1"] = 5
var currentCt = activeMinDic[String(1)]
activeMinDic[String(1)] = 1 + 1 // works fine
activeMinDic[String(1)] = 1 + currentCt // does not work
activeMinDic[String(1)] = 1 + Int(currentCt!) // works

3 个答案:

答案 0 :(得分:1)

你应该将你的字典声明为[Int:NSNumber],这样你可以使用Int作为Key,并使用if to towrap你的字典值。看看:

var activeMinDic:[Int: NSNumber] = [:]
activeMinDic[1] = 5

if let currentCt = activeMinDic[1] as? Int {
    println(currentCt)
    activeMinDic[currentCt] = 1 + 1 // works fine
    activeMinDic[currentCt] = 1 + currentCt
}

答案 1 :(得分:1)

您遇到的问题并非针对NSNumber。这是Swift词典返回一个可选的,因为它们的键可能不会出现在字典中。

所以这一行:

var currentCt = activeMinDic[String(1)]

是这方面的简写:

var currentCt: NSNumber? = activeMinDic[String(1)]

您必须以某种方式从键提取中解包返回值,例如:

// default to an NSNumber of 0 if not present
let currentCt = activeMinDic[String(1)] ?? 0

// or require it:
if let currentCt = activeMinDic[String(1)] {
    // use currentCt
}
else {
    // handle currentCt not being present
}

重新建立桥接 - 没有从NSNumber到其他数字类型的隐式转换。事实上,两个+甚至没有NSNumbers。请记住,NSNumber可以包含各种不同类型的数字表示形式,您可以使用.floatValue.integerValue等来提取.Swift作为一种语言非常严格(与其他类似C语言不同)语言)不是在不同类型之间隐式转换(避免所有相关的隐式截断等问题)所以你需要明确说明要提取的数字(使用.integerValueas Int或{ {1}} Int就像你在这里做的那样。)

答案 2 :(得分:1)

字典属于[String:NSNumber]类型,但方法subscript(key: Key) -> Value? { get set}确实返回可选字典。您最好通过重载的subscript()运算符了解[]方法。