第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Swift支持反射嗎?

Swift支持反射嗎?

陪伴而非守候 2019-10-16 13:12:25
Swift支持反射嗎?例如,是否有valueForKeyPath:和setValue:forKeyPath:Swift對象類似的東西?實際上,它甚至還具有動態(tài)類型系統(tǒng),例如obj.class在Objective-C中嗎?
查看完整描述

3 回答

?
慕雪6442864

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 {

}


查看完整回答
反對 回復(fù) 2019-10-16
?
慕工程0101907

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)容。


查看完整回答
反對 回復(fù) 2019-10-16
  • 3 回答
  • 0 關(guān)注
  • 585 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號