2017-02-20 54 views
3

在C++ 11和後者中,可以使用類似語法decltype()的編譯時函數來重用變量的聲明類型以聲明另一個變量而不重寫類型簽名。 Swift中是否有等價的語法工具?在Swift中是否存在decltype等價物?

C++實施例:

class SomeClass { 
public: 
    SomeVeryLongTypeName* my_prop; 
} 

void foo() { 
    SomeClass my_var = SomeClass(); 

    // Below code is a variable declaration, not a function call 
    declytype(my_var.my_prop) some_prop = nullptr; 

    // Below is same as above 
    SomeVeryLongTypeName* some_prop = nullptr; 
} 

回答

1

有,據我所知,沒有直接的等效語法工具在夫特容易獲得的。

但是,對於稍微類似的東西,可以使用泛型來訪問(在編譯時)元類型(語法: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_propSomeVeryLongTypeName類型(其,在這裏,簡單地Int),其由於Swift的靜態類型是在編譯時已知自然的。

但是,請注意,在Swift中,我們不能使用這種技術來只聲明類型,但也必須實例化它們。此外,Swift中沒有「默認初始值設定項」的概念(與C++中的缺省CTOR:s相比),因此需要將declmetatype(...)中的泛型類型持有者約束爲我們自己的協議,其中我們提供了一個藍圖初始值設定項我們希望從元類型的「默認意義上」使用。

我們可以參觀the Language Reference - Types - Metatypes額外的細節元類型,特別是:

使用的初始化表達式構造型 該類型的元類型值的一個實例。對於類實例,調用的初始化程序 必須標有required關鍵字或整個 類標有final關鍵字。

在那裏我已經強調了可使用的元類型,構建實例的類型(如上圖所示),這不,但是,使用元類型只蓋申報類型。

+0

我相信這一努力,這似乎是我的情況的答案。非常感謝你。 – diegoperini

+1

對於好奇的未來讀者,我必須指出'let some_prop = declmetatype(my_var.my_prop).init()'這一行是關鍵問題。 – diegoperini

+1

@diegoperini樂意幫忙。指出上面的通用'declmetatype(_ :)'方法和簡單地使用本地可用的全局['type(of:)'函數](https://developer.apple)之間的區別也許是很好的。 COM /參考/迅速/ 2831805型);後者用於查看值的動態類型。我已經展示了這兩者之間的主要區別(在這個要點中)(https://gist.github.com/dfrib/bf1e3a97e83858426dab811877f13016)(編譯時與運行時/動態類型)。 – dfri

相關問題