簡體   English   中英

在Swift中的運行時定義新類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM