需求分析:
1)由于一个方法要返回多种可能的类型,因此须要用到泛型。json
// 定义一个 A 对象
public struct A {
init(json: JSON)
}
// 取 A
func getA<T>(type: T.Type) -> T? {
if type == A.self { // 根据不一样类型,作不一样解析
return A(json: JSON) as? T
}
return nil
}
复制代码
完成。
2)可是 1> 调用者传未定义的类型 T 怎么办
2> 可不能够避免解析后强转为 T
3> 解析方法可不能够统一块儿来,不作判断优化
因此,并非任意 T 类型都实现了 init(json: JSON)
方法,咱们应该对 T 作约束,只能传咱们定义的模型。
考虑到咱们的每一个模型都有相同的方法 init(json: JSON)
,因此此处可用协议对咱们的模型作约束,让模型遵照此协议,并必须实现 init。ui
优化后以下:url
public protocol Returnable {
init(json: JSON)
}
public struct AModel: Returnable {
public var a: Double = 0
init(json: JSON) {
a = json["aKey"].DoubleValue
}
}
public struct BModle: Returnable {
public var b: Double = 0
init(json: JSON) {
b = json["bKey"].DoubleValue
}
}
........ more custom model types
复制代码
调用spa
public func getVariousModle<T: Returnable>(type: T.Type)-> Observable<(T)> {
return HTTPClient.rxRequest(url: url, method: .get)
.map { (arg) -> (T) in
let (_, dataJSON) = arg
return T(json: json) // 准守 Returnable 协议的模型都支持 init(json: JSON)
}
}
复制代码
完成。
虽然实现了根据参数返回不一样模型,可是,此处必须已知想要的 T.Type 才能传参,因此可不能够不传 type 参数?
未完......code