【问题标题】: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 在第一个函数中是可映射的?

【问题讨论】:

    标签: swift generics objectmapper


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多