所謂反射就是可以動態獲取型別、成員資訊,在執行時可以呼叫方法、屬性等行為的特性。 在使用oc
開發時很少強調其反射概念,因為oc的runtime
要比其他語言中的反射強大的多。不過在swift
中並不提倡使用runtime
,而是像其他語言一樣使用反射(reflect
),即使目前swift
中的反射功能還比較弱,只能訪問獲取型別、成員資訊。
swift
的反射機制是基於乙個叫mirror
的結構體來實現的。你為具體的例項建立乙個mirror
物件,然後就可以通過它查詢這個例項
mirror結構體常用屬性:
下面來簡單介紹下mirror的使用:
//定義乙個類來進行測試
class person
//建立乙個物件並初始化
let p = person()
p.name = "小強"
p.age = 13
//1. 建立物件的反射,獲取物件型別
let mirror: mirror = mirror(reflecting:p)
print("獲取物件型別\(mirror.subjecttype)")
// 列印出:獲取物件型別person
//2. 獲取物件屬性名以及對應的值
for p in mirror.children
/* 列印:
name的值為optional("小強")
age的值為13
*///3. 獲取指定索引下的屬性型別
let children = mirror.children
let p0 = children.startindex.advancedby(0) //獲取name屬性的位置索引
let p0mirror = mirror(reflecting: children[p0].value) //name的反射
print("獲取屬性name的型別為\(p0mirror.subjecttype)")
//列印:獲取屬性name的型別為optional
//4. 遍歷獲取物件所有動態的屬性型別
for p in mirror.children
/* 列印:
屬性name型別為optional
屬性age型別為int
*/
反射的應用場景現在還比較狹窄,因為功能還不夠完善,我提供乙個比較常見的反射應用場景,那就是自定義類模型轉字典
以下就是自定義類模型轉字典例項
//自定義使用者類
class user
//**結構體
struct telephone
//自定義乙個json協議
protocol json
//擴充套件協議方法,實現乙個通用的tojsonmodel方法(反射實現)
extension json
}return result
}return self
}}//擴充套件可選型別,使其遵循json協議,可選型別值為nil時,不轉化進字典中
extension optional: json
}return nil
}}//擴充套件兩個自定義型別,使其遵循json協議
extension user: json
extension telephone: json
//擴充套件swift的基本資料型別,使其遵循json協議
extension string: json
extension int: json
extension bool: json
extension dictionary: json
extension array: json
//建立乙個user例項物件模型
let user1 = user()
user1.name = "hangge"
user1.age = 100
user1.emails = ["[email protected]","[email protected]"]
//新增**
let tel1 = telephone(title: "手機", number: "123456")
let tel2 = telephone(title: "公司座機", number: "001-0358")
user1.tels = [tel1, tel2]
//模型轉字典
if let model = user1.tojsonmodel()
/* 列印:【以下列印經過排版,正式的列印是緊湊的】
["tels": [
"[1]": [
"title": "公司座機",
"number": "001-0358"
], "[0]": [
"title": "手機",
"number": "123456"
]],"name": "hangge",
"emails": [
"[1]": "[email protected]",
"[0]": "[email protected]"
],"age": 100
]*/
Swift學習筆記 八 屬性
儲存屬性 儲存常量或變數作為例項的一部分 計算屬性計算 而不是儲存 乙個值。計算屬性 可以用於類 結構體和列舉裡 儲存屬性只能用於類和結構體.儲存屬性 簡單來說,乙個儲存屬性就是儲存在特定類或結構體的例項裡的乙個常量或變數,儲存屬性可以是變數儲存屬性 用關鍵字 var定義 也可以是常量儲存屬性 用關...
iOS 學習筆記, Swift名字空間
在swift中,名字空間是用class extension 巢狀來實現的,以下用乙個簡單樣例來進行展示 main.swift swiftnamespace created by yao yu on 14 8 1.swift名字空間使用例項 import foundation 定義頂層名字空間 cla...
iOS協議的學習筆記swift版
協議,協議就是類成員函式的引用,用於類之間傳值.形象的說就是有需求的類沒有可實現需求的成員函式,委託有實現需求的成員函式的類 實現需求,可以簡化 使 便於維護,使用的過程就是引用,引用只看物件,所以需要對協議進行宣告 格式protocol protocol 自定義型別,引用型別可以建立引用 類名 繼...