iOS 中一个方法有多种返回值(Swift 实现)

需求分析:
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

相关文章
相关标签/搜索