Swift: 如何 return class 从函数中输入

Swift: how to return class type from function

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

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

但是我们如何 return 从函数中输入?写类似

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

给出编译器错误 "Int is not identical to T"。那么是否可以从 swift 函数中输入 return?

编辑
一些解释。我有 classes 用于持久性(我正在使用 Realm),我有 classes 作为这个 classes 的包装器。所有包装器都继承自 RealmClassWrapper,它需要知道它实际包装的领域 class。所以假设我有这个领域模型:

class RealmTodo: RLMObject {
   dynamic var title = ""
}

我的包装纸晚餐 class 看起来像这样:

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 }
}

是的,这是可能的。这里的问题是你说你的函数 return 是一个泛型 T.type,但你总是 return Int.type。由于 T 并不总是 Int,因此编译器会引发错误。

当我像这样修改你的函数时它起作用了:

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

getGeneric(0)    // Swift.Int

您可以return任何类型。

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

如果类型不是由参数决定的,或者如果 return 是常量,则不需要引入泛型 T 类型。

您可以强制向下转换 (as!),如下所示

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

但超出函数作用域,需要注明返回类型:

var t:Int.Type = getGeneric()

如果您不想指定 return 类型,您可以使用 AnyClass 作为模板参数。

class A {}

class B {}

public enum ExampleEnum: String {
    case a
    case b
    
    func asClass() -> AnyClass {
        switch self {
        case .a:
            return A.self
        case .b:
            return B.self
        }
    }
}



let myGoal : AnyClass = ExampleEnum.a.asClass()

您也可以避免最终转换为 AnyClass,但编译器会向您显示错误