Swift:如何从函数返回类类型

时间:2015-03-22 15:53:41

标签: ios swift generics

我知道可以将类类型传递给swift中的函数:

func setGeneric<T>(type: T.Type){ }
setGeneric(Int.self)

但我们如何从函数返回类型?写点像

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

给出编译器错误&#34; Int与T&#34;不同。那么可以从swift函数返回类型吗?

修改
一些解释。我有用于持久化的类(我使用Realm),我有类充当这个类的包装器。所有包装器都继承自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 }
}

4 个答案:

答案 0 :(得分:28)

您可以返回任何您想要的类型。

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

如果未根据参数确定类型,或者返回值是常量,则无需引入通用T类型。

答案 1 :(得分:8)

当我像这样修改你的功能时它会起作用:

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

getGeneric(0)    // Swift.Int

答案 2 :(得分:2)

你可以强制下传(如下!)

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

但是在函数范围之外,您需要指出返回的类型:

var t:Int.Type = getGeneric()

答案 3 :(得分:0)

是的,这是可能的。这里的问题是你说你的函数返回一个通用T.type,但你总是返回Int.type。由于T不总是Int,编译器会引发错误。