我有一个我正在快速字典中存储的数字。我正在使用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
答案 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语言不同)语言)不是在不同类型之间隐式转换(避免所有相关的隐式截断等问题)所以你需要明确说明要提取的数字(使用.integerValue
,as Int
或{ {1}} Int
就像你在这里做的那样。)
答案 2 :(得分:1)
字典属于[String:NSNumber]
类型,但方法subscript(key: Key) -> Value? { get set}
确实返回可选字典。您最好通过重载的subscript()
运算符了解[]
方法。