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
參考連接: