结构的Swift动态类型检查?

J. *_*coe 6 struct dynamic swift

我对Swift中的动态类型检查感到困惑.

具体来说,我有一个怪异的情况,我想在本质上写一个(或找到)一个函数:

func isInstanceOf(obj: Any, type: Any.Type) -> Bool
Run Code Online (Sandbox Code Playgroud)

在Objective-C中,这是isKindOfClass,但这不起作用,因为Any.Type包括Swift结构,它不是类(更少的NSObject子类).

我不能is在这里使用Swift ,因为这需要硬编码类型.

我无法使用,obj.dynamicType == type因为这会忽略子类.

斯威夫特书似乎表明,该信息将丢失,且没有可用的结构在所有:

类具有结构不具备的附加功能:

...

  • 类型转换使您可以在运行时检查和解释类实例的类型.

(在Type Casting一章中,它说"Swift中的类型转换是用is和as运算符实现的",所以它似乎是一个比其他语言更广泛的"类型转换"定义.)

但是,不能使用is/ as不能使用结构,因为你可以将字符串和Ints放入一个[Any],然后将它们拉出来,并使用is Stringis Int弄清楚它们是什么.Swift Book的Type Casting章节正是这样做的!

有什么东西isKindOfClass和任何Swift实例一样强大吗?这些信息仍然必须在运行时存在,对吧?

Jan*_*ans 8

实际上你可以使用is运算符.

使用类型检查运算符(is)检查实例是否属于某个子类类型.如果实例属于该子类类型,则类型检查运算符返回true,否则返回false.

由于struct不能被子类化,is因此在应用于struct的实例时保证是一致的,因为它将检查它的静态类型,对于类,它将在运行时查询动态类型.

func `is`<T>(instance: Any, of kind: T.Type) -> Bool{
   return instance is T;
}
Run Code Online (Sandbox Code Playgroud)

这项工作适用于structclass.