从泛型类型快速实例化

Posted

技术标签:

【中文标题】从泛型类型快速实例化【英文标题】:Swift instantiate from generic type 【发布时间】:2017-09-25 11:06:47 【问题描述】:

我有一个实现 Mappable 协议的类,我想将类型作为参数传递给函数并获取该对象的实例,但该类型也可能是原始类型。

class MyMappable : Mappable 

    required init?(map: Map) 

        print("i am custom mappable")
    


func getInstance<T>() -> T

    if T.self == Int.self 

        return 10 as T
    

    if T.self is Mappable.self 
        return T(Json : [:]) //this is the problem, T is not Mappable
    


我尝试的是像这样为 getInstance 创建 2 覆盖:

func getInstance<T>() -> T

func getInstance<T : Mappable>() -> T

但对于更多类型,它可能会被大量覆盖。 有没有办法让 swift 知道 T 在第一个函数中是可映射的?

【问题讨论】:

【参考方案1】:

您可以有条件地将其转换为这样的 Mappable(未经测试):

if let MappableType = T.self as? Mappable.self 
    return MappableType(Json : [:])

通常变量名是小写的,但在这种情况下我可以想象使用大写,因为它被用作一种类型。

您也可以根据您的使用情况/呼叫站点采取不同的方式。

约束getInstance&lt;T&gt;() -&gt; T方法怎么样:

getInstance&lt;T: Mappable&gt;() -&gt; T

【讨论】:

以上是关于从泛型类型快速实例化的主要内容,如果未能解决你的问题,请参考以下文章

如何通过泛型类型实例化? [复制]

在C#中实例化泛型类型的实例

实例化泛型类时如何避免指定冗余类型

递归泛型类型的实例化速度越慢,嵌套越深。为啥?

如何在基类中实例化泛型类型?

如何通过使用类型名称来实例化泛型类?