美文网首页
iOS 中一个方法有多种返回值(Swift 实现)

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

作者: 切一斤桃花卖酒钱 | 来源:发表于2018-11-16 18:51 被阅读38次

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

相关文章

网友评论

      本文标题:iOS 中一个方法有多种返回值(Swift 实现)

      本文链接:https://www.haomeiwen.com/subject/kifvfqtx.html