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 String或is Int弄清楚它们是什么.Swift Book的Type Casting章节正是这样做的!
有什么东西isKindOfClass和任何Swift实例一样强大吗?这些信息仍然必须在运行时存在,对吧?
实际上你可以使用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)
这项工作适用于struct和class.
| 归档时间: |
|
| 查看次数: |
2926 次 |
| 最近记录: |