我有一个由AnyObject组成的数组。我想遍历它,找到所有数组实例的元素。

我怎么能检查如果一个对象是一个给定的类型在Swift?


当前回答

在Swift 2.2 - 5你现在可以做:

if object is String
{
}

然后过滤你的数组:

let filteredArray = originalArray.filter({ $0 is Array })

如果你有多个类型需要检查:

    switch object
    {
    case is String:
        ...

    case is OtherClass:
        ...

    default:
        ...
    }

其他回答

在Swift 2.2 - 5你现在可以做:

if object is String
{
}

然后过滤你的数组:

let filteredArray = originalArray.filter({ $0 is Array })

如果你有多个类型需要检查:

    switch object
    {
    case is String:
        ...

    case is OtherClass:
        ...

    default:
        ...
    }

如果您不知道您将从服务器的响应中获得一个字典数组或单个字典,则需要检查结果是否包含数组。 在我的情况下,总是接收一个字典数组,除了一次。所以,为了处理这个问题,我使用了下面的swift 3代码。

if let str = strDict["item"] as? Array<Any>

在这里吗?Array检查获取的值是否为Array(字典项)。在其他情况下,你可以处理,如果它是一个字典项,而不是保存在数组中。

let originalArray : [Any?] = ["Hello", "World", 111, 2, nil, 3.34]
let strings = originalArray.compactMap({ $0 as? String })

print(strings)
//printed: ["Hello", "World"]

是吗?不会总是给出预期的结果,因为as并不测试数据类型是否为特定类型,而只测试数据类型是否可以转换为或表示为特定类型。

以下面的代码为例:

func handleError ( error: Error ) {
    if let nsError = error as? NSError {

每个符合Error协议的数据类型都可以转换为NSError对象,所以这总是会成功。但这并不意味着error实际上是一个NSError对象或它的子类。

正确的类型检查应该是:

func handleError ( error: Error ) {
    if type(of: error) == NSError.self {

但是,这只检查确切的类型。如果你还想包含NSError的子类,你应该使用:

func handleError ( error: Error ) {
    if error is NSError.Type {

如果你只是想检查类而不得到警告,因为未使用的定义值(let somvariable…),你可以简单地用一个布尔值替换let:

if (yourObject as? ClassToCompareWith) != nil {
   // do what you have to do
}
else {
   // do something else
}

Xcode在我使用let方法而没有使用定义值时提出了这个建议。