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

Mismatching types 'Int64' and '_' when trying to assign optional Int64 to a dictionary key

关于 Swift 2.1 在 Xcode 7.

中的问题

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

var something: Int64?

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

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

XCode 给我以下验证错误:

Result values in '? :' expression have mismatching types: 'Int64' and '_'

这里有什么问题?为什么可选的 Int64 不能为 nil?

有点东西!类型为 Int64。不是可选的 Int64,而是 Int64。 nil 的类型为 nil。你不能有表达式

condition ? Int64 : nil

它的类型是什么?

而且整件事毫无意义。在右侧,您只有 "something"。如果这不起作用,那么您的字典不接受可选值。

PS。注意到您的字典想要存储 Objective-C 个对象。在那种情况下,它绝不会接受可选的。并且它在转换为 NSNumber 后只接受 Int64。

您不能将 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 添加到其中。

这里有很多问题。首先,Int64 不是 AnyObject。 None 个原始数字类型是 类。它们可以使用 NSNumber 桥接到 AnyObject,但是您不会为 Int64 自动桥接(请参阅 MartinR 的评论。我最初说这是因为它被包装在一个可选的,但实际上是因为它是 fixed-width).

接下来,这个语法:

(something != nil) ? something! : nil

只是一种非常复杂的说法 something

您想要的工具是 map,这样您就可以使用可选工具并将其转换为 NSNumber(如果存在)。

dictionary["something"] = something.map(NSNumber.init)

当然,如果在所有可能,去掉AnyObject。这种类型是一种巨大的痛苦,会导致很多问题。如果这是 [String: Int64] 你可以:

dictionary["something"] = something

看来其他人已经指出了您字典中类型的问题。我想补充一点,您还可以使用 nil 合并运算符 '??'对于您在示例中所做的事情,更加简洁shorthand。当你想检查 nil 时,它是最有用的,(如果 non-nil)打开值并分配它,否则提供默认值。

var maybeSomething: Int?
var dictionary:[String:Int?] = [:]
dictionary["something"] = maybeSomething ?? nil