需求分析:
1)因为一个方法要返回多种可能的类型,所以需要用到泛型。
// 定义一个 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。
优化后如下:
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
调用
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 参数?
未完......
网友评论