【问题标题】:Swift: how to return class type from functionSwift:如何从函数返回类类型
【发布时间】:2015-03-22 15:53:40
【问题描述】:

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

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

但是我们如何从函数返回类型呢?写类似

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

给出编译器错误“Int 与 T 不同”。那么是否可以从 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 }
}

【问题讨论】:

    标签: ios swift generics


    【解决方案1】:

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

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

    如果类型不是根据参数确定的,或者如果返回是常量,则不需要引入泛型T 类型。

    【讨论】:

    • 我在搜索如何使用协议执行此操作时偶然发现了这一点。假设你有一个公共协议 ImageRendering 和一个私有 MyImageRenderer 实现,你可以做 func getRendererType() -&gt; ImageRendering.Type { return MyImageRenderer.self } 并且它会工作。
    【解决方案2】:

    当我像这样修改你的函数时它可以工作:

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

    【讨论】:

    • 感谢您的回答!但是,您的示例检查对象并返回它的类型,但我想创建一个没有输入参数并返回指定类型的函数(如我的示例中)。
    • 我不明白你想要达到什么目的。你不想要任何参数?那么你希望函数返回什么?总是同一类型?
    • 我已经更新了我的答案,以便为我的问题提供上下文。
    【解决方案3】:

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

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

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

    var t:Int.Type = getGeneric()
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 感谢您的回答!但我仍然不清楚如何从函数返回 Int 类型
      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 2020-04-29
      • 2017-07-31
      相关资源
      最近更新 更多