私はジェネリックとテンプレートが違うことを認識しますが、テンプレートに精通している人が私が達成しようとしていることを知っているので、私はC++を捨てると思っていました。以下のコードでは、1つのオーバーロードバリアントで文字列を処理する1つの汎用メンバーメソッドを記述しようとしています。もう一つの変形では、このメソッドは文字列から初期化できる数値型を扱うことになっています。Swiftのジェネリックスで "C++ - ishテンプレートの特殊化"を達成するにはどうすればよいですか?
以下、私はマップを取りたいと思います。特定のタイプの変数があれば、マップ内の名前を調べ、正しいタイプに解析します。残念ながら、私はタイプ(of :)のinit()の不足やInt型の呼び出しが文字列のために定義されたメソッドを呼び出そうとするオーバーロード解決の問題に関連して、
ここでは、コードです:
protocol StringInitializable {
init()
init(_: String)
}
class Foo {
var stringMember : String
var intMember : Int
var lookupMap : [String:String] = [
"string" : "Your String",
"int": "12"
]
func extractType< ParseEntity: StringInitializable >(parameter: ParseEntity, lookupName: String) throws -> ParseEntity? {
var x : ParseEntity?
x = type(of: ParseEntity).init(lookupMap[ lookupName ])
return x
}
func extractType(parameter: String, lookupName: String) throws -> String? {
return lookupMap[ lookupName ]
}
init() {
do {
try extractType(parameter: stringMember, lookupName: "string")
try extractType(parameter: intMember, lookupName: "int")
} catch {}
}
}
コードは少しハックですが、うまくいけば全体の意思を伝えるには十分あります。援助はまったく役に立ちます。前もって感謝します。