[英]Define new class at runtime in Swift
我想在運行時定義一個臨時類(目的是創建用於測試的模擬對象)。 例如:
class Foo {
func bar(classType) {
class Mock: classType {
// class body
}
let m = Mock()
...
}
}
目前可以在Swift中做這樣的事情嗎? 如果不是直接的話,也許通過泛型?
這聽起來像在Ruby中可能要做的事情。 但是Swift與Ruby相反:每種類型都必須在編譯時完全定義。
如果在編譯時知道classType
則您的代碼當然是合法的:在函數中定義類沒有任何問題(當然,在運行其余函數時,它僅在作用域內)。 但是該類的超類必須在編譯時進行定義。 它不能推遲到運行時。
是的,沒有; 也許不,是的。
如@matt的回答所述,Swift類型非常靜態。 因為它會在編譯時已知的所有打字仍然是靜態的,例如,其中:在斯威夫特一個仿制葯制度的存在並沒有改變這個T
是在使用時您使用一個通用的像func foo<T>(t: T)
或創建Array<T>
。 編譯器必須具有創建子類的類的知識,因此您不能在其中使用動態運行時信息。 (即使有可能將泛型類型參數作為子類,也必須對該參數進行約束,以使編譯器可以靜態了解可能的超類。)
但是,Swift使用和與Objective-C運行時進行互操作(在Apple平台上;抱歉,Linux-etc等開源Swift用戶)。 因此,您可以基於僅在運行時可用的知識,使用ObjC運行時API 創建類 ,並在運行時動態地使用方法和屬性填充類 。 從理論上講,您甚至可以使用這些API以及來自Swift代碼的結果類...當然,它不會很漂亮,因為根據定義,您的Swift代碼在編譯時不會為動態創建的類提供靜態類型信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.