Swift中有一个等效的decltype吗?

时间:2017-02-20 11:38:54

标签: c++ swift c++11

在C ++ 11和后者中,可以使用类似语法decltype()的编译时函数来重用声明类型的变量来声明另一个变量而不重写类型签名。 Swift中是否有任何等效的句法工具?

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 个答案:

答案 0 :(得分:1)

据我所知,在Swift中没有直接的等效句法工具。

但是,对于稍微类似的东西,你可以使用泛型来获取(在编译时)元类型(语法: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中没有“default initializers”的概念(与C ++中的默认CTOR:s相比),因此需要将declmetatype(...)中的泛型类型约束为我们的协议拥有,我们为某些初始化程序提供了蓝图,我们希望从元类型的“默认意义”中使用它。

我们可能会访问the Language Reference - Types - Metatypes以获取有关元类型的更多详细信息,尤其是:

  

使用初始化表达式构造类型的实例   从该类型的元类型值。对于类实例,初始化程序   被调用的必须使用required关键字或整个关键字进行标记   标有final关键字的类。

我强调可以使用元类型来构造类型的实例(如上所示),但是,这不包括使用元类型仅声明类型。