Swift:在循环中检查对象类型

时间:2016-03-01 10:55:20

标签: swift struct casting

我正在尝试检查一个对象的类型,该对象可以是for循环中的各种结构,但我在双方都遇到错误。这是我的代码:

for object in objectArray {

    if object is structType
    {
      ....
    }
}

我收到的错误是 语句中的 。编译器说 条件总是评估为true。的为什么吗

如果我在for循环中使用对象:任何技术,那么 if 中的任何子检查都会抱怨 Any 声明拒绝我要查看 object.name 之类的内容,声称该对象不能包含 name 等子属性。

我的代码是将一个随机结构类型发送到要处理的函数,并根据发现的类型,我需要深入了解对象以获取不同的属性。

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

  

我得到的错误是在if语句中。编译器说is条件总是评估为true。为什么呢?

这意味着objectArray的对象类型是structType。否则这是xCode中的一个错误(它发生在我身上)。

  

如果我使用对象:for循环中的任何技术,那么if中的任何子检查都会抱怨Any声明拒绝我检查像object.name这样的东西,声称对象不能有诸如name之类的子属性。

首先需要将对象强制转换为structType,然后才能访问这些方法,否则编译器将不知道它拥有属性。正如@mattias建议的那样,我会做

if let myStruct = object as? structType {
    print("\(myStruct.name)")
} 

此外,如果您有许多结构(比如超过2个)并且它们具有相似的属性,我建议您使用协议来避免大量的if let s

答案 1 :(得分:1)

这取决于objectArray的定义。

如果objectArray被定义为给定Struct的数组(让我们说这样的[Cat])然后你检查一个元素是否是Cat,当然编译器会告诉你它总是正确的。

也许你想要这样的东西

struct Cat { }
struct Dog { }
struct Lion { }

let animals:[Any] = [Cat(), Dog(), Lion()]

for animal in animals {
    switch animal {
    case let cat as Cat: print("It's a cat")
    case let dog as Dog: print("It's a dog")
    case let lion as Lion: print("It's a lion")
    default: fatalError()
    }
}