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

需求分析:
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 参数?
未完......

转载于:https://juejin.im/post/5d0b985ce51d45508c2fb865

猜你喜欢

转载自blog.csdn.net/weixin_34186931/article/details/93170755
今日推荐