关于Xcode 7中的Swift 2.1的问题。
我已经声明了一个像这样的可选变量:
dictionary['something'] = (something != nil) ? something! : nil
我想稍后使用简写将其分配给字典键,如下所示:
{{1}}
XCode给出了以下验证错误:
''中的结果值? :'表达式有不匹配的类型:'Int64'和 '_'
这是什么问题?为什么可选的Int64不能为零?
答案 0 :(得分:7)
这里有很多问题。首先,Int64
不是AnyObject
。原始数字类型都不是类。他们可以使用AnyObject
桥接到NSNumber
,但是你没有为Int64
自动桥接(参见MartinR的评论。我原先说这是因为它被包装在一个Optional中,但实际上是因为它是固定宽度的。)
接下来,这个语法:
(something != nil) ? something! : nil
说something
只是一种非常复杂的方式。
您想要的工具是map
,以便您可以选择并将其转换为NSNumber
(如果存在)。
dictionary["something"] = something.map(NSNumber.init)
当然,如果所有可能,请摆脱AnyObject
。这种类型是一个巨大的痛苦,并导致很多问题。如果这是[String: Int64]
,您可以:
dictionary["something"] = something
答案 1 :(得分:2)
您无法将Int64
添加到类型为[String : AnyObject]
的字典中,您需要将其包含在NSNumber
对象中。您只能在字典中存储符合AnyObject
的对象。
var something: Int64?
something = 42
if let myVal: Int64 = something { // unwrap to make sure the value is there
let myNum = NSNumber(longLong: myVal) // create an NSNumber from your Int64
dictionary["something"] = myNum // insert it into the dictionary
}
正如Anton Bronnikov所说,如果您的词典是[String : Int64]
类型,那么您可以将Int64添加到它中没问题。
答案 2 :(得分:1)
似乎其他人已经指出了词典中类型的问题。我想补充一点,你也可以使用nil coalescing运算符'??'作为你的例子中你正在做的更简洁的简写。当你想要检查nil时,它是最有用的,(如果是非nil)打开值并分配它,否则提供默认值。
var maybeSomething: Int?
var dictionary:[String:Int?] = [:]
dictionary["something"] = maybeSomething ?? nil
答案 3 :(得分:0)
东西!有类型Int64。不是可选的Int64,而是Int64。零没有类型。你不能有表达
condition ? Int64 : nil
它的类型是什么?
整件事情毫无意义。在右手边你会得到一些东西"。如果那不起作用,那么你的词典就不会接受选项。
PS。注意到您的字典想要存储Objective-C对象。在这种情况下,它无法接受可选项。它只在转换为NSNumber后接受Int64。