从泛型类型快速实例化
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<T>() -> T
方法怎么样:
getInstance<T: Mappable>() -> T
【讨论】:
以上是关于从泛型类型快速实例化的主要内容,如果未能解决你的问题,请参考以下文章