三十岁
注意:本人水平有限,如有错误,请说下哈
注意:advance的使用,在xcode 7beta版 跟 xcode 7.0.1 (7的正式版,我没用)是不一样的
前奏,在使用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()。😭)
Swift 2.0 字符串截取处理方式
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
参考链接:
- Relection 和 mirror(《SWIFTER 100个Swift必备Tips》第二版,作者:王巍。)
- Mirror http://swiftdoc.org/v2.0/type/Mirror/
- Reflect https://github.com/CharlinFeng/Reflect
- MirrorType http://nshipster.com/mirrortype/[非2.0语法]
- Swift Reflection (Swift 的反射)http://andelf.github.io/blog/2014/06/20/swift-reflection/ [非2.0语法]
浙公网安备 33010602011771号