我想检查字典值的类型,并使用以下测试代码:
let swiftDict = [1: "one", 2: "two"]
if swiftDict[1] is NSString {
println("it's an nsstring")
}
我收到了编译器警告:“从'String?'转换无关的NSString总是失败。
将代码修改为以下内容:
if let str = swiftDict[1] as? NSString? {
println("it's an nsstring")
}
现在我收到编译器警告:来自String的条件转换?到NSString?总是成功。
如何修复上述警告?检查变量类型的正确方法是什么?
检查的原因是要确定是否存储了String或NSString。
答案 0 :(得分:4)
为什么你要测试你的值类型,因为Swift已经是类型安全的?
与Objective-C相反,Swift中的数组和字典是键入的。因此,您的swiftDict
变量的类型为Dictionary<Int, String>
(或简称为[Int:String]
),因此根据定义,此字典的值始终为String
。
例如,如果你曾试图写这个:
let swiftDict = [1: "one", 2: "two", 3: 7]
// error: '_' is not convertible to 'StringLiteralConvertible'
然后编译器会报错,告诉你7不是String
类型,也不能转换为String
,所以你不能把它添加到swiftDict
,这被推断为属于[Int:String]
这意味着,根据定义,swiftDict[1]
始终为String
(因为swiftDict
是[Int:String]
)...或nil
如果没有该词典中的关键1
。
- &GT; swiftDict[1]
保证为String?
类型。所以你甚至不需要测试类型转换。您只需要测试它是否为nil
。
if let value = swiftDict[1] {
println("swiftDict has a string value of \(value) for key 1")
} else {
println("swiftDict does not have the key 1")
}
[编辑]另请注意,String
和NSString
是免费桥接的,这意味着它们完全可以互换。因此,如果String
是NSString
,您甚至无需测试或投射,因为始终可以从String
投射到NSString
,反之亦然(始终可以将您的字符串解释为String
或NSString
)。
答案 1 :(得分:2)
如果您有一个混合类型的字典(即值:AnyObject),您可以迭代它们并使用is
来检查字典中的值是什么类型,例如。
let swiftDict:[Int:AnyObject] = [1: "one", 2: "two", 3: 15, 4: true]
for (key, value) in swiftDict
{
if (value is String)
{
println("\(key): \(value) is String")
}
}
答案 2 :(得分:0)
如果将它转换为字符串或NSString,因为它只是字典中的字符序列。两者都有效。如果它是字典中的字符串,则是字符串或NSString,具体取决于您设置的字符串。
if let str = swiftDict[1] as? String
{
println("it's an string")
}
答案 3 :(得分:0)
后卫可以使用
guard let key = swiftDict[1] else {
println("swiftDict does not have the key 1")
return;
}