需求分析:
1)因?yàn)橐粋€(gè)方法要返回多種可能的類型广鳍,所以需要用到泛型。
// 定義一個(gè) A 對象
public struct A {
init(json: JSON)
}
// 取 A
func getA<T>(type: T.Type) -> T? {
if type == A.self { // 根據(jù)不同類型弧呐,做不同解析
return A(json: JSON) as? T
}
return nil
}
完成。
2)但是
1> 調(diào)用者傳未定義的類型 T 怎么辦
2> 可不可以避免解析后強(qiáng)轉(zhuǎn)為 T
3> 解析方法可不可以統(tǒng)一起來,不做判斷
所以沾瓦,并不是任意 T 類型都實(shí)現(xiàn)了 init(json: JSON)
方法,我們應(yīng)該對 T 做約束谦炒,只能傳我們定義的模型暴拄。
考慮到我們的每個(gè)模型都有相同的方法 init(json: JSON)
,所以此處可用協(xié)議對我們的模型做約束编饺,讓模型遵守此協(xié)議,并必須實(shí)現(xiàn) init响驴。
優(yōu)化后如下:
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
調(diào)用
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) // 準(zhǔn)守 Returnable 協(xié)議的模型都支持 init(json: JSON)
}
}
完成透且。
雖然實(shí)現(xiàn)了根據(jù)參數(shù)返回不同模型,但是豁鲤,此處必須已知想要的 T.Type 才能傳參秽誊,所以可不可以不傳 type 參數(shù)?
未完......