Swiftの関数にクラス型を渡すことが可能であることを知っています:
func setGeneric<T>(type: T.Type){ }
setGeneric(Int.self)
しかし、どのようにして関数から型を返すことができますか?のようなものを書く
func getGeneric<T>() -> T.Type {
return Int.self
}
コンパイラエラー「IntはTと同一ではありません」を返します。 Swift関数から型を返すことは可能ですか?
編集
いくつかの説明。永続化に使用されるクラスがあり(レルムを使用しています)、このクラスのラッパーとして機能するクラスがあります。すべてのラッパーは、RealmClassWrapper
を継承します。これは、実際にラップするRealmクラスを知る必要があります。それでは、このレルムモデルがあるとしましょう。
class RealmTodo: RLMObject {
dynamic var title = ""
}
ラッパーの夕食クラスは次のようになります。
class RealmClassWrapper {
private let backingModel: RLMObject
//...
func backingModelType<T>() -> T.Type{ fatalError("must be implemented") }
}
実際のラッパー:
class Todo: RealmClassWrapper {
//some other properties
func backingModelType<T>() -> T.Type{ return RealmTodo.self }
}
必要な型を返すことができます。
func getTypeOfInt() -> Int.Type { return Int.self }
func getTypeOfBool() -> Bool.Type { return Bool.self }
型が引数から決定されない場合、または戻り値が定数である場合、一般的なT
型を導入する必要はありません。
このように関数を変更すると機能します:
func getGeneric<T>(object: T) -> T.Type {
return T.self
}
getGeneric(0) // Swift.Int
次のようにダウンキャストを強制することができます(as!)
func getGeneric<T>() -> T.Type {
return Int.self as! T.Type
}
ただし、関数のスコープ外では、返される型を示す必要があります。
var t:Int.Type = getGeneric()
はい、これは可能です。ここでの問題は、関数が汎用のT.type
、ただし常にInt.type
。 Tは常にIntではないため、コンパイラはエラーを発生させます。