web-dev-qa-db-ja.com

Swift:関数からクラス型を返す方法

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 }
}
31
Nikita Arkhipov

必要な型を返すことができます。

func getTypeOfInt()  -> Int.Type  { return Int.self  }
func getTypeOfBool() -> Bool.Type { return Bool.self }

型が引数から決定されない場合、または戻り値が定数である場合、一般的なT型を導入する必要はありません。

28
GoZoner

このように関数を変更すると機能します:

func getGeneric<T>(object: T) -> T.Type {
    return T.self
}

getGeneric(0)    // Swift.Int
8
ayaio

次のようにダウンキャストを強制することができます(as!)

func getGeneric<T>() -> T.Type {
  return Int.self as! T.Type
} 

ただし、関数のスコープ外では、返される型を示す必要があります。

var t:Int.Type = getGeneric()
2
jcnm

はい、これは可能です。ここでの問題は、関数が汎用のT.type、ただし常にInt.type。 Tは常にIntではないため、コンパイラはエラーを発生させます。

0
Rengers