尝试将可选的 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
关于 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