我有一个实现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在第一个函数中可以映射?
答案 0 :(得分:0)
您可以有条件地将它投射到像这样的Mappable(未经测试):
if let MappableType = T.self as? Mappable.self {
return MappableType(Json : [:])
}
通常变量名称是小写的,但在这种情况下,我可以想象使用大写,因为它被用作类型。
根据您的使用/呼叫网站,您也可以采用不同的方式。
如何约束getInstance<T>() -> T
方法:
getInstance<T: Mappable>() -> T