layout: post
title: "反射──Mirror(swift 2.0)"
category: Swift2.0
date: 2015-10-15 12:45
---git
注意:本人水平有限,若有错误,请说下哈github
注意:advance的使用,在xcode 7beta版 跟 xcode 7.0.1 (7的正式版,我没用)是不同的数据库
Mirror
以前咱们先创建一个对象,方便测试!建立Person.swift,文件内容以下:swift
import UIKit class Person: NSObject { var name: String? var age: Int = 0 }
Mirror
任意对象实例
的子结构
跟可选显示类型
的展示。xcode
例如 存储属性,集合元素,元组或者枚举框架
subjectType
:对象类型
函数
children
:反射对象的属性集合
post
displayStyle
:反射对象展现类型
测试
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) }
除了上面的遍历,你还能够这样:code
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封装一层?对吧,这是我本身想的,在写这个类。自定义模型
继承这个类使用
swift2.0示例:截取最后一个字符 环境 7.0 beta 6 let a = "a,b,c," let ad = advance(a.endIndex, -1) print(a.substringToIndex(ad)) 环境 7.0.1 正式版 let a = "a,b,c," print(a.substringToIndex(a.endIndex.advancedBy(-1))) 那么截取范围呢? beta以下: print(a.substringWithRange(Range(start: advance(a.endIndex, -2),end: advance(a.endIndex, -1)))) 正式以下: print(a.substringWithRange(Range(start: a.endIndex.advancedBy(-2), end: a.endIndex.advancedBy(-1)))) 参考连接:http://stackoverflow.com/questions/28182441/swift-how-to-get-substring-from-start-to-last-index-of-character
参考连接: