我正在尝试检查一个对象的类型,该对象可以是for循环中的各种结构,但我在双方都遇到错误。这是我的代码:
for object in objectArray {
if object is structType
{
....
}
}
我收到的错误是 语句中的 。编译器说 条件总是评估为true。的为什么吗
如果我在for循环中使用对象:任何技术,那么 if 中的任何子检查都会抱怨 Any 声明拒绝我要查看 object.name 之类的内容,声称该对象不能包含 name 等子属性。
我的代码是将一个随机结构类型发送到要处理的函数,并根据发现的类型,我需要深入了解对象以获取不同的属性。
有更好的方法吗?
答案 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()
}
}