三十歲


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

參考連接:

相關文章
相關標籤/搜索