美文网首页
runtime时的类型检测

runtime时的类型检测

作者: shoage | 来源:发表于2019-03-15 17:06 被阅读0次

1.先来个例子
先声明一个协议 protocol  RouterProtocol
接着来个类遵循该协议extension K1ViewController: RouterProtocol
实例化K1ViewController   let ctl = K1ViewController()
根据实例获取类名:let name =NSStringFromClass(type(of: ctl))
根据类名获取类,方式一:
clz = NSClassFromString(name)
根据类名获取类,方式二:
let cchar = (name as NSString).utf8String
let clz2 =objc_getClass(cchar)

2.分析 
ctl是一个实例,print(ctl is K1ViewController) print(ctl is RouterProtocol)结果都会返回true
print(ctl is K1ViewController.Type)  print(ctl is RouterProtocol.Type)都会得到总是返回false的警告,因为实例是K1ViewController类型而不是K1ViewController.Type 类型,同理实例是RouterProtocol类型而不是RouterProtocol.Type类型

clz,NSClassFromString返回的是AnyClass,也即是AnyObject.Type,print(clz is K1ViewController)会得到总是返回false的警告,clz是AnyObject.Type类型,而K1ViewController是AnyObject类型两者并不是一个东西,            print(clz is K1ViewController.Type)才会返回true

clz2,objc_getClass返回Any类型,区别于NSClassFromString返回的AnyClass,clz跟clz2并不能直接相比较,但是clz2强转换AnyClass后,会发现跟clz是同一个东西。由于clz2是Any类型,所以print(clz2 is  K1ViewController)以及 print(clz2 is  K1ViewController.Type)编译器都不会有警告,但是clz2实质还是一个AnyObject.Type类型所以前者会返回false,后返回true

值得注意的是:OC里面的@protocol跟swift里的protocol是不同的,OC里的协议继承NSObject协议,而swift里没有这一说,因为这一差异,protocol.Type和protocol也会不一样,当protocol为OC里的@protocol类型时,protocol.Type和protocol什么区别,print(clz is RouterProtocol.Type)以及print(clz is RouterProtocol)都返回true;当protocol为纯swift时,后者会返回false

相关文章

  • runtime时的类型检测

    1.先来个例子先声明一个协议protocolRouterProtocol接着来个类遵循该协议extension K...

  • Js类型相关总结

    Js的基本数据类型 复杂数据类型 类型检测 typeof 检测检测原理是根据变量存储时低位 instanceof检...

  • Runtime 的概念和使用场景 (二)

    runtime 的概念和使用场景 一、runtime 是什么 运行时(Runtime)是指将数据类型的确定由编译时...

  • 深入浅出Runtime (一) 什么是Runtime? 定义?

    深入浅出 Runtime详解 Runtime是什么? 运行时(Runtime)是指将数据类型的确定由编译时推迟到了...

  • runtime

    runtime简介 runtime源码地址 运行时(Runtime)是指将数据类型的确定由编译时推迟到了运行时 R...

  • iOS底层原理--Runtime isa

    runtime简介 运行时(Runtime)是指将数据类型的确定由编译时推迟到了运行时,Runtime是一套比较底...

  • Java(一)泛型

    泛型是 JDK5 引入的新特性,提供了编译时类型安全检测机制,允许在编译时检测到非法的类型数据结构。 一、泛型类型...

  • Java 泛型

    Java泛型(generics)提供了编译时类型安全检测机制,该机制允许程序员啊在编译时检测到非法的类型,使更多的...

  • Android常见风控检测位置

    root 检测 root管理apk检测 shell 执行su命令 Runtime.getRuntime().exe...

  • Java 范型

    范型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。范型的本质是参数化类型,也就是说所操作...

网友评论

      本文标题:runtime时的类型检测

      本文链接:https://www.haomeiwen.com/subject/ebrlmqtx.html