三十岁


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:反射对象展现类型测试

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)
}

除了上面的遍历,你还能够这样: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)
}

应用场景

  1. 有个成都的小伙子写的字典转模型的框架——Reflect。就用的这个反射写成的。

  2. 给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

参考连接:

相关文章
相关标签/搜索