尝试将可选的Int64分配给字典键时,类型“Int64”和“_”不匹配

时间:2016-01-20 14:20:02

标签: ios swift int64

关于Xcode 7中的Swift 2.1的问题。

我已经声明了一个像这样的可选变量:

dictionary['something'] = (something != nil) ? something! : nil

我想稍后使用简写将其分配给字典键,如下所示:

{{1}}

XCode给出了以下验证错误:

  

''中的结果值? :'表达式有不匹配的类型:'Int64'和   '_'

这是什么问题?为什么可选的Int64不能为零?

4 个答案:

答案 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。