Swift从泛型类型实例化

时间:2017-09-25 11:06:47

标签: swift generics objectmapper

我有一个实现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 个答案:

答案 0 :(得分:0)

您可以有条件地将它投射到像这样的Mappable(未经测试):

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

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

根据您的使用/呼叫网站,您也可以采用不同的方式。

如何约束getInstance<T>() -> T方法:

getInstance<T: Mappable>() -> T