2017-02-20 6 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)にアクセスすることができます。その後、イニシャライザ式を使用して具体的な型のインスタンスを構築できますメタタイプの)。

上記 foo()
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 
} 

some_prop起因スウィフトの静的型に自然にコンパイル時に知られているタイプSomeVeryLongTypeName(これは、ここでは、単にIntである)、です。

しかし、Swiftでは、この手法を使用して型を宣言するだけではなく、それらをインスタンス化する必要があることに注意してください。さらに、Swiftにはの「デフォルトイニシャライザ」のコンセプトはありません(C++のデフォルトCTORと比較して)。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/reference/swift/2831805-type);後者は動的な型の値を見ていました。私は、これらの2つの主な違いを(この要点では)(https://gist.github.com/dfrib/bf1e3a97e83858426dab811877f13016)(コンパイル時間対ランタイム/ダイナミックタイプ)示しました。 – dfri

関連する問題