有,據我所知,沒有直接的等效語法工具在夫特容易獲得的。
但是,對於稍微類似的東西,可以使用泛型來訪問(在編譯時)元類型(語法:metatype-type → type.Type
),然後可以使用初始化表達式來構造具體類型的實例的元類型)。
protocol Initializable {
init()
}
typealias SomeVeryLongTypeName = Int
extension SomeVeryLongTypeName : Initializable {}
class SomeClass {
let my_prop : SomeVeryLongTypeName
required init() { my_prop = 1 }
}
func declmetatype<T: Initializable>(_: T) -> T.Type {
return T.self
}
func foo() {
let my_var = SomeClass()
let some_prop = declmetatype(my_var.my_prop).init()
some_prop = my_var.my_prop + 1
}
在上述foo()
,some_prop
是SomeVeryLongTypeName
類型(其,在這裏,簡單地Int
),其由於Swift的靜態類型是在編譯時已知自然的。
但是,請注意,在Swift中,我們不能使用這種技術來只聲明類型,但也必須實例化它們。此外,Swift中沒有「默認初始值設定項」的概念(與C++中的缺省CTOR:s相比),因此需要將declmetatype(...)
中的泛型類型持有者約束爲我們自己的協議,其中我們提供了一個藍圖初始值設定項我們希望從元類型的「默認意義上」使用。
我們可以參觀the Language Reference - Types - Metatypes額外的細節元類型,特別是:
使用的初始化表達式構造型 該類型的元類型值的一個實例。對於類實例,調用的初始化程序 必須標有required
關鍵字或整個 類標有final
關鍵字。
在那裏我已經強調了可使用的元類型,構建實例的類型(如上圖所示),這不,但是,使用元類型只蓋申報類型。
我相信這一努力,這似乎是我的情況的答案。非常感謝你。 – diegoperini
對於好奇的未來讀者,我必須指出'let some_prop = declmetatype(my_var.my_prop).init()'這一行是關鍵問題。 – diegoperini
@diegoperini樂意幫忙。指出上面的通用'declmetatype(_ :)'方法和簡單地使用本地可用的全局['type(of:)'函數](https://developer.apple)之間的區別也許是很好的。 COM /參考/迅速/ 2831805型);後者用於查看值的動態類型。我已經展示了這兩者之間的主要區別(在這個要點中)(https://gist.github.com/dfrib/bf1e3a97e83858426dab811877f13016)(編譯時與運行時/動態類型)。 – dfri