在Swift 3中如何检查一个对象是否为字典类型?

6
尝试使用“is”关键字。
// Initialize the dictionary

let dict = ["name":"John", "surname":"Doe"]

// Check if 'dict' is a Dictionary

if dict is Dictionary {
    print("Yes, it's a Dictionary")
}

这将会报错,提示“'is' 始终为 true”。 我只是想检查一个对象是否是字典。它可以包含任何键值对。

enter image description here

键是可散列的,而且不接受 Any 关键字。


为什么需要进行此检查? - Abizern
这是一个示例代码。我想检查对象是否为字典、数组或其他任何类型。@Abizern - abhimuralidharan
你是通过类似于JSON解析的方式来做这个吗? - Abizern
@Abizern 是的。. - abhimuralidharan
如果字典来自JSON解析,那么您确实知道键是String(根据JSON规范)。 - vadian
显示剩余4条评论
5个回答

11
如果您想检查任意对象是否为字典,首先必须将该对象指定为未指定状态。
let dict : Any = ["name":"John", "surname":"Doe"]

现在,您可以检查对象是否为字典

if dict is Dictionary<AnyHashable,Any> {
    print("Yes, it's a Dictionary")
}

但这种方式只是理论上的,仅用于学习目的。将一个明确的类型转换为未指定的类型基本上是相当愚蠢的。


非常感谢@vadian。我不知道有一个叫做AnyHashable的关键字。它很有效。 - abhimuralidharan
1
是的,你可以这样做,但如果你知道对象比“Any”更具体,请告诉编译器该类型。不要与强类型系统作斗争。 - vadian
这是正确的答案。在实践中,如果要检查的字典只有一个具体类型,则最好使用该具体类型,但是有时检查通用字典是有效/首选的 - 例如,在构建可以接受任何类型的字典的容器时。 - Shaun

6
如果您只是想检查对象是否为字典,可以这样做:

if let dictionary = yourObject as? Dictionary{

    print("It is a Dictionary")

}

对我来说非常有效。谢谢! - Ravi

1
我更喜欢在解析JSON对象时使用if letguard let
if let dict = jsonObject as? [AnyHashable:Any] {
     print("Yes, it's a Dictionary")
}

guard let dict = jsonObject as? [AnyHashable:Any] else {
     print("No, it's not a Dictionary")
     return
}

1
把这个放在游乐场里:
import UIKit

// Create a dictionary and an array to convert to and from JSON

let d = ["first": "Goodbye", "second": "Hello"]
let a = [1, 2, 3, 4, 5]

let dictData = try! JSONSerialization.data(withJSONObject: d, options: [])
let arrayData = try! JSONSerialization.data(withJSONObject: a, options: [])

// Now that we have set up our test data, lets see what we have

// First, some convenience definitions for the way JSON comes across.

typealias JSON = Any
typealias JSONDictionary = [String: JSON]
typealias JSONArray = [JSON]

// Lets see what we have

let dict = try! JSONSerialization.jsonObject(with: dictData, options: [])
let array = try! JSONSerialization.jsonObject(with: arrayData, options: [])

// testing functions

func isDictionary(_ object: JSON) -> Bool {
    return ((object as? JSONDictionary) != nil) ? true : false
}

func isArray(_ object: JSON) -> Bool {
    return ((object as? JSONArray) != nil) ? true : false
}


// The actual tests

isDictionary(dict) // true
isArray(dict)      // false

isDictionary(array)// false
isArray(array)     // true

JSON字典和数组有特定的类型


谢谢@Abizern,我尝试了这个。这很好用。但是你使用了一个String:Any格式的字典。这在json解析中完美地工作。我想检查一下对象是否是字典类型。我之前不知道关键字“AnyHashable”。 - abhimuralidharan
Swift 中的字典是有类型的。Objective-C 字典是 [AnyHashable: Any] - Abizern

0

只需使用is运算符来检查类型的一致性。

这里有一个小片段,我检查它是一个Dictionary还是一个Array

let dict = ["name":"John", "surname":"Doe"]
let array = [ "John", "Doe" ]

if dict is Dictionary<String, String>
{
    print("Yes, it's a Dictionary")
}
else
{
    print("No, It's other thing")
}

if array is Array<String>
{
    print("Yes, it's a Array")
}
else
{
    print("No, It's other thing")
}

请将字典转换为数组并运行此代码,可以吗? - abhimuralidharan
我已经添加了一个数组,并在第二个if语句中检查了它的类型 @abhi1992 - Adolfo
我做到了。一直都是这样 http://swift.sandbox.bluemix.net/#/repl/58d3a9e8ff20be4ef473d2be @abhi1992 :-) - Adolfo
我忘记在字典定义中使用泛型类型。我的错误。现在已经编辑。http://swift.sandbox.bluemix.net/#/repl/58d3ab3bff20be4ef473d2bf - Adolfo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接