スウィフトで容易に入手可能で直接対応構文ツールは、私の知る限り、ありません。
しかしながら、幾分似ているものの、ジェネリックを使って(コンパイル時に)メタタイプ(文法: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
キーワードでマークする必要があります。私は、しかし、唯一の宣言タイプにメタタイプを使用してカバーしていないインスタンス(上図のように)タイプのを構築するためにメタタイプの利用可能使用することを強調してきた
。
私は努力を信じていますが、これは私の場合の答えと思われます。どうもありがとうございました。 – diegoperini
私は興味のある読者のために、 'let some_prop = declmetatype(my_var.my_prop).init()'という行に注意する必要があります。この行が問題の要点です。 – diegoperini
@diegoperini喜んで助けてください。上記の一般的な 'declmetatype(_ :)'メソッドの違いを指摘し、ネイティブで利用可能なグローバル['type(of:)'関数](https://developer.apple。 com/reference/swift/2831805-type);後者は動的な型の値を見ていました。私は、これらの2つの主な違いを(この要点では)(https://gist.github.com/dfrib/bf1e3a97e83858426dab811877f13016)(コンパイル時間対ランタイム/ダイナミックタイプ)示しました。 – dfri