3 回答

TA貢獻(xiàn)1812條經(jīng)驗 獲得超5個贊
如果一個類擴(kuò)展了NSObject,那么Objective-C的所有內(nèi)省和活力都會起作用。這包括:
向類詢問其方法和屬性,以及調(diào)用方法或設(shè)置屬性的能力。
交換方法實現(xiàn)的能力。(向所有實例添加功能)。
動態(tài)生成和分配新子類的能力。(向給定實例添加功能)
此功能的一個缺點是對Swift可選值類型的支持。例如,可以枚舉和修改Int屬性,但是Int?屬性不能??蛇x類型可以使用reflect / MirrorType進(jìn)行部分枚舉,但仍不能修改。
如果一個類沒有擴(kuò)展NSObject,那么只有新的,非常有限的(并且正在進(jìn)行中?)反射起作用(請參見reflect / MirrorType),這增加了向?qū)嵗儐栍嘘P(guān)其類和屬性的能力,但是上面沒有其他功能。
當(dāng)不擴(kuò)展NSObject或使用'@objc'指令時,Swift默認(rèn)為基于靜態(tài)和基于vtable的調(diào)度。但是,這更快,因為在沒有虛擬機(jī)的情況下不允許運(yùn)行時方法攔截。這種攔截是Cocoa的基本組成部分,并且是以下幾種類型的功能所必需的:
可可優(yōu)雅的房地產(chǎn)觀察家。(屬性觀察者會立即使用Swift語言)。
非侵入性地應(yīng)用橫切關(guān)注點,例如日志記錄,事務(wù)管理(即,面向方面的編程)。
代理,消息轉(zhuǎn)發(fā)等
因此,建議使用Swift實施的Cocoa / CocoaTouch應(yīng)用程序中的分類:
從NSObject擴(kuò)展。Xcode中的新類對話框?qū)⒊@個方向發(fā)展。
在動態(tài)調(diào)度的開銷導(dǎo)致性能問題的情況下,則可以使用靜態(tài)調(diào)度-例如,在緊密循環(huán)中調(diào)用具有非常小的主體的方法。
摘要:
Swift的行為類似于C ++,具有快速的靜態(tài)/ vtable調(diào)度和有限的反射。這使其適用于較低級別或性能密集的應(yīng)用程序,但沒有C ++帶來的復(fù)雜性,學(xué)習(xí)曲線或錯誤風(fēng)險
盡管Swift是一種編譯語言,但是方法調(diào)用的消息傳遞風(fēng)格增加了像Objective-C一樣在Ruby和Python等現(xiàn)代語言中發(fā)現(xiàn)的內(nèi)省性和動態(tài)性,但沒有Objective-C的舊語法。
參考數(shù)據(jù):方法調(diào)用的執(zhí)行開銷:
靜態(tài):<1.1ns
vtable:?1.1ns
動態(tài):?4.9ns
(實際性能取決于硬件,但是比率將保持相似)。
同樣,dynamic屬性允許我們顯式指示Swift某個方法應(yīng)使用動態(tài)調(diào)度,因此將支持?jǐn)r截。
public dynamic func foobar() -> AnyObject {
}

TA貢獻(xiàn)1887條經(jīng)驗 獲得超5個贊
該文檔涉及動態(tài)類型系統(tǒng),主要涉及
Type 和 dynamicType
請參見元類型類型(在語言參考中)
例:
var clazz = TestObject.self
var instance: TestObject = clazz()
var type = instance.dynamicType
println("Type: \(type)") //Unfortunately this prints only "Type: Metatype"
現(xiàn)在假設(shè)TestObject擴(kuò)展NSObject
var clazz: NSObject.Type = TestObject.self
var instance : NSObject = clazz()
if let testObject = instance as? TestObject {
println("yes!") //prints "yes!"
}
當(dāng)前,沒有實現(xiàn)反射。
編輯:我顯然是錯誤的,請參閱stevex的答案。對于內(nèi)置的屬性有一些簡單的只讀反射,可能允許IDE檢查對象內(nèi)容。
- 3 回答
- 0 關(guān)注
- 585 瀏覽
添加回答
舉報