swift反射──Mirror(swift 2.0)
2015-10-16 13:49
141 查看
注意:advance的使用,在xcode 7beta版 跟 xcode 7.0.1 (7的正式版,我没用)是不一样的
前奏,在使用
创建Person.swift,文件内容如下:
其次,我们介绍下
任意
例如 存储属性,集合元素,元组或者枚举
创建一个
获取
获取
除了上面的遍历,你还可以这样:
获取属性的
获取
指定——就是说我们知道这个类肯定有属性,而且还知道有几个,否则 advance中,你填写了 100,没有100个属性,就崩溃了
获取
我并不知道我有几个属性。
给FMDB封装一层?对吧,这是我自己想的,在写这个类。
比如:p.insert(),就是Peron对象p中的对象插入到数据库,你可以做类型校验,假设,你插入的是Text 而数据类型是 Integer,校验之后,报个错提示下用户。(你可以封装成,p.where(“age>14”).select(),注意,swift中不能使用where跟select做函数名字,因此我换成了p.condition(“age>14”).find()。
前奏,在使用Mirror
之前我们先建立一个对象,方便测试!
创建Person.swift,文件内容如下:import UIKit class Person: NSObject { var name: String? var age: Int = 0 }
其次,我们介绍下Mirror
任意对象实例的
子结构跟
可选显示类型的展现。
例如 存储属性,集合元素,元组或者枚举
常用属性
subjectType:对象
类型
children:反射对象的
属性集合
displayStyle:反射对象展示
类型
Mirror 使用
创建一个 Person
对象,使用Mirror
反射
let p = Person() p.name = "小强" p.age = 13 let mirror: Mirror = Mirror(reflecting:p)
获取对象类型
mirror.subjectType print(mirror.subjectType) // 打印出:Person
获取对象属性
以及属性的值
for p in mirror.children { let propertyNameString = p.label! // 使用!因为label 是 optional类型 let v = p.value // 这个是属性的值,name 是可选属性打印为Optional("小强") 13 print(v) print(propertyNameString) }
除了上面的遍历,你还可以这样:
for (index, value) in mirror.children.enumerate() { index // 0 value.label! value.value print(value.label) print(value.value) }
获取属性的类型
获取指定的属性
类型
指定——就是说我们知道这个类肯定有属性,而且还知道有几个,否则 advance中,你填写了 100,没有100个属性,就崩溃了
let children = mirror.children let p0 = advance(children.startIndex, 0, children.endIndex) // name 的位置 let p0Mirror = Mirror(reflecting: children[p0].value) // name 的反射 print(p0Mirror.subjectType) //Optional<String> 这个就是name 的类型
获取
动态的属性
类型
我并不知道我有几个属性。
for p in mirror.children { let propertyNameString = p.label! let v = p.value let vMirror = Mirror(reflecting: v) // 通过值来获取 属性的 类型 print(vMirror.subjectType) }
应用场景
有个成都的小伙子写的字典转模型的框架——
Reflect。就用的这个
反射写成的。
给FMDB封装一层?对吧,这是我自己想的,在写这个类。
自定义模型继承这个类使用
比如:p.insert(),就是Peron对象p中的对象插入到数据库,你可以做类型校验,假设,你插入的是Text 而数据类型是 Integer,校验之后,报个错提示下用户。(你可以封装成,p.where(“age>14”).select(),注意,swift中不能使用where跟select做函数名字,因此我换成了p.condition(“age>14”).find()。
相关文章推荐
- 通过运行时给view关联一个nameTag(含Swift2.0)
- Swift2.1 语法指南——泛型
- swift 替换反斜杠
- 《从零开始学Swift》学习笔记(Day 23)——尾随闭包
- Swift UITableView相关功能(一)创建tableView
- 《从零开始学Swift》学习笔记(Day 23)——尾随闭包
- Swift2.1 语法指南——协议
- 学习 swift (1)
- Swift & the Objective-C Runtime
- swift 2.0 函数
- swift 2.0 循环语句
- Swift基础知识_01
- Swift利用inout交换两个数的位置
- swift 2.0 分支语句 if...else & switch
- swift 2.0 元组
- swift 2.0 字典
- swift 2.0 数组
- swift 2.0 基本数据类型 强转类型
- Swift 2.0 手动添加数据类型的标注
- Swift 2.0 变量、常量定义