Swift:检查字典值的类型

时间:2015-05-30 11:52:53

标签: swift introspection

我想检查字典值的类型,并使用以下测试代码:

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。

4 个答案:

答案 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")
}

[编辑]另请注意,StringNSString是免费桥接的,这意味着它们完全可以互换。因此,如果StringNSString,您甚至无需测试或投射,因为始终可以从String投射到NSString,反之亦然(始终可以将您的字符串解释为StringNSString)。

答案 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;
            }