Swift中的反射
原文:http://www.cocoachina.com/applenews/devnews/2014/0623/8923.html
本文介绍主要的反射使用方法和相关类型。
name of that protocol followed by .Protocol. For example, the metatype of the class type SomeClass is SomeClass.Type and the metatype of the protocol SomeProtocol is SomeProtocol.Protocol.
not an instance of a type that conforms to SomeProtocol at runtime.
- metatype-type –> type.Type | type.Protocol
- type-as-value –> type.self
- protocol Reflectable {
- func getMirror() -> Mirror
- }
- protocol Mirror {
- var value: Any { get }
- var valueType: Any.Type { get }
- var objectIdentifier: ObjectIdentifier? { get }
- var count: Int { get }
- subscript (i: Int) -> (String, Mirror) { get }
- var summary: String { get }
- var quickLookObject: QuickLookObject? { get }
- var disposition: MirrorDisposition { get }
- }
- 1.value 相当于变量的 as Any 操作
- 2.valueType 获得变量类型
- 3.objectIdentifier 相当于一个 UInt 作用未知。可能是 metadata 表用到
- 4.count 子项目个数(能够是类、结构体的成员变量。也能够是字典,数组的数据)
- 5.subscript(Int) 訪问子项目, 和子项目的名字
- 6.summary 相当于 description
- 7.quickLookObject 是一个枚举,这个在 WWDC 有讲到,就是 Playground 代码右边栏的显示内容,比方常见类型,颜色。视图都能够
- 8.disposition 表示变量类型的性质,基础类型 or 结构 or 类 or 枚举 or 索引对象 or … 例如以下
- enum MirrorDisposition {
- case Struct // 结构体
- case Class // 类
- case Enum // 枚举
- case Tuple // 元组
- case Aggregate // 基础类型
- case IndexContainer // 索引对象
- case KeyContainer // 键-值对象
- case MembershipContainer // 未知
- case Container // 未知
- case Optional // Type?
- var hashValue: Int { get }
- }
- let mir = reflect(someVal)
- swift mir.valueType {
- case _ as String.Type:
- println("type = string")
- case _ as Range<Int>.Type:
- println("type = range of int")
- case _ as Dictionary<Int, Int>.Type:
- println("type = dict of int")
- case _ as Point.Type:
- println("type = a point struct")
- default:
- println("unkown type")
- }
- if mir is String.Type {
- println("!!!type => String")
- }
- for r in 0..mir.count {
- let (name, subref) = mir[r]
- prtln("name: \(name)")
- // visit sub Mirror here
- }
- .count 为字段个数。
- subscript(Int) 返回 (字段名,字段值反射 Mirror) 元组
- summary 为 mangled name
- .count 为元组子元素个数
- subscript(Int) 的 name 为 “.0”, “.1” …
怀疑是没实现完。
- .count 为 0
- .count 为元组子元素个数
- subscript(Int) 的 name 为 “[0]”, “[1]” …
- .count 为元组子元素个数
- subscript(Int) 的 name 为 “[0]”, “[1]” … 实际訪问是 (name, (reflect(key), reflect(val)))
,不包含 Type!。
- .count 为 0 或者 1 (相应 nil 和有值的情况)
- subscript(Int) , name 为 “Some”
由于考虑到有些编程经验不是非常丰富的朋友对于此问题可能会感觉比較迷糊。
事实上第一段也比較重要——
比方:
- Class strClass = [NSString class];
- NSLog(@"The class name is: %s.", class_getName(strClass));
比方改动成员属性、甚至替换成员方法的实现等。这样的功能特性在计算机编程语言中也被称作为反射--Reflection。
Swift中的反射的更多相关文章
- Swift Swift中的反射
Swift的反射机制是基于一个叫 Mirror 的 struct 来实现的,其内部有如下属性和方法: let children: Children //对象的子节点. displayStyle: Mi ...
- 思考 Swift 中的 MirrorType 协议
Swift中的反射非常有限,仅允许以只读方式访问元数据的类型子集.或许 Swift 因有严格的类型检验而不需要反射.编译时已知各种类型,便不再需要进行进一步检查或区分.然后大量的 Cocoa API ...
- 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON
项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...
- swift中的结构体和枚举
Swift 里的结构体非常特殊. 类是面向对象编程语言中传统的结构单元.和结构体相比,Swift 的类支持实现继承,(受限的)反射,析构函数和多所有者. 既然类比结构体强大这么多,为什么还要使用结构体 ...
- Swift 中枚举
Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [AP ...
- swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明
关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...
- 详解C#中的反射
反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B ...
- Swift中的可选链与内存管理(干货系列)
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...
- 在Swift中实现单例方法
在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...
随机推荐
- Java可以像Python一样方便爬去世间万物
前言: 之前在大二的时候,接触到了Python语言,主要是接触Python爬虫那一块 比如我们常用的requests,re,beautifulsoup库等等 当时为了清理数据和效率,还专门学了正则表达 ...
- MyBatis从入门到放弃三:一对一关联查询
前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是使用association属性和resultM ...
- Hyperledger Fabric密码模块系列之BCCSP(一)
Fabric作为IBM主导的区块链平台,可谓是联盟链中的一枝独秀,现如今已经有100多个大型国际银行.金融以及科技公司的加盟.与其说Fabric是区块链的一种平台,倒不如说是一个区块链框架更加精确,因 ...
- https Java SSL Exception protocol_version
在java代码中,使用HttpClient爬取https页面时,遇到了这个bug:javax.net.ssl.SSLException: Received fatal alert: protocol_ ...
- [转]微擎MVC
本文转自:https://www.kancloud.cn/donknap/we7/134626 控制器 控制器以文件夹.文件的形式组织,位于系统的 source 目录下,每一个目录代表一个 contr ...
- vb.net 日期時間
Dim dMyDate As DateTime = DateTime.Now‘當前時間日期 DateDiff("h", C13, C3)’ 二時間差 ‘日期格式 C2 = Form ...
- (1)Microsoft office Word 2013版本操作入门_常用功能区
word2013界面做了比较大的优化,刚开始用的时候不太习惯,研究了一下win10下word的新版本,记录以下几个功能小技巧: 1.常用功能区: 新打开一个word文档 文件.开始 .插入 等菜单称 ...
- canvas-4fillstyle.html
fillStyle color gradient pattern image canvas video strokeStyle
- 两年AI研究经验(教训)总结,进来看看吧!
https://www.jianshu.com/p/2149c9fee166 摘要: 本文以过来人的身份将自身2年的研究经验做了一下分享,希望本文对于即将开始从事人工智能研究的朋友有所帮助. 人工智能 ...
- 安全测试 web应用安全测试之XXS跨站脚本攻击检测
web应用安全测试之XXS跨站脚本攻击检测 by:授客 QQ:1033553122 说明 意在对XSS跨站脚本攻击做的简单介绍,让大家对xss攻击有个初步认识,并能够在实际工作当中运用本文所述知识做些 ...