首先說(shuō)一下objectc是動(dòng)態(tài)語(yǔ)言而swift是靜態(tài)語(yǔ)言,而runtime又是基于動(dòng)態(tài)語(yǔ)言的運(yùn)行時(shí)進(jìn)行的一些操作,所以就導(dǎo)致swift并不能像oc那樣簡(jiǎn)單的使用runtime
一、關(guān)于類屬性的名稱、類型、運(yùn)行時(shí)賦值和獲取值。
class_copyIvarList 和 class_copyProperty 是獲取當(dāng)前類變量的方法
class_copyIvarList 可以獲取全部的屬性
class_copyProperty 只能獲取@property的屬性
以上兩個(gè)方法在swift中都可以獲取到全部屬性包括私有屬性但是不包括擴(kuò)展里Associated設(shè)置的屬性(目前我測(cè)試是這樣的)
由于swift中很多類型都是值類型,比如NSString有了可替換的String,所以并不能動(dòng)態(tài)編譯。
在swift中定義String類型的屬性 在使用object_getIvar和object_setIvar時(shí)候會(huì)導(dǎo)致bad access, 目前可替換的方法是讓本類繼承NSObject并且用@objc修飾定義的String,使用value(for:key)方法獲取value;
至于Int可以 @objc dynamic var order_batch : Int = 0 初始化賦值的時(shí)候需要手動(dòng)判空了,其他沒(méi)有初始值的定義也可以參考Int樣式定義
二、swift的extension和oc的category中不能定義屬性但是可以使用runtime設(shè)置附加屬性的set和get來(lái)達(dá)到定義屬性的效果;
三、方法替換:使用class_getInstanceMethod獲取到替換和被替換的方法實(shí)例,如果替換和被替換方法都已經(jīng)存在已所屬頁(yè)面,那么直接用method_exchangeImplementations交換已經(jīng)獲取到的兩個(gè)方法實(shí)例即可,若是需要用新方法替換需要class_addMethod先添加進(jìn)runtime里,再替換class_replaceMethod;
letAS =Selector(("aaa"))
letBS =#selector(tihuanM)
let AAA = class_getInstanceMethod(OrderList.self, AS)
let BBB = class_getInstanceMethod(ViewController.self, BS)
let didAddMethod = class_addMethod(OrderList.self, AS, method_getImplementation(BBB!), method_getTypeEncoding(BBB!))
ifdidAddMethod
{
class_replaceMethod(ViewController.self, BS, method_getImplementation(AAA!), method_getTypeEncoding(AAA!))
}
else
{
method_exchangeImplementations(AAA!, BBB!)
}
@objc func tihuanM() { print("tttt") }
如果不想寫新方法 可以使用class_replaceMethod :imp_implementationWithBlock 直接把實(shí)現(xiàn)寫在block里
四、總結(jié)一下runtime可以使用的范圍 引用他人圖片
