Swift中是否有宣言

Is there a decltype equivalent in Swift?

本文关键字:宣言 是否 Swift      更新时间:2023-10-16

在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;
}

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

对于某些略微相似的东西,您可以使用仿制药来访问(在编译时间)元类型(语法: metatype-type → type­.­Type),以后您可以使用初始化器表达式来构造混凝土类型的实例(of元类型)。

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中没有"默认初始化器" (与默认的ctor:s in c 相比),因此需要将declmetatype(...)中的通用类型持有人限制为我们自己的协议,我们向我们想从Metatype中使用的"默认意义"中使用某些初始化器。

我们可以访问语言参考 - 类型 - Metatypes,以获取有关Metatypes的其他详细信息,特别是:

使用initializer表达式构建一个类型的实例 从该类型的元类值。对于课堂实例,初始化器 这就是所谓的required关键字或整个关键字必须标记 标记为final关键字的类。

我强调了用于构建类型的实例的可用使用(如上所示),但是,它并不能仅使用metatypes覆盖 neclare 类型。