分别开放不同的接口给OC和Swift

2019-12-25 10:42:32 浏览数 (1)

最近使用Swift编写Framework,遇到有一些方法想单独开放给OC,另一些单独开放给Swift使用,之所以有这样的想法都是归于Swift和OC存在一定的差异性,比如强大的Swift的枚举

下面用一个登陆方法举例:

代码语言:javascript复制
    typealias callBack = (_ msg: String?, _ error: Error?) -> Void

    @objc func loginBy(mobile: String, mobileArea: String, password: String, callBack: callBack) 

    @objc func loginBy(email: String, password: String, callBack: callBack) 

因为手机登陆(需要国家码(中国 86))邮箱登陆的差异性,只能开放出去两个接口

  • 如果单独是Swift使用我们可以利用Swift 的 Enum合成一个并且看起来更加简洁的接口:
代码语言:javascript复制
    enum LoginType {
        case mobile(_ mobile: String, mobileArea: String, password: String, callBack: callBack)
        case email(_ email: String, password: String, callBack: callBack)
    }

统一接口:

代码语言:javascript复制
    func login(by loginType:LoginType)

这样子,我们就把接口统一并且简化了,但是这个只能在Swift中使用,现在的问题是,现在在Swift中有三个接口:

swift调用

可以看到调用的时候,新的接口确实更加简洁了,虽然最终传参还是一样长,但是毕竟统一且好看不少

这时候我的问题来了,怎么在OC只暴露上面两个接口(默认就是这样),Swift只暴露单个统一的login接口(现在是三个),研究的半天,最终使用了一个很神奇的关键字: @available

代码语言:javascript复制
    @available(swift 999.0)
    @objc func loginBy(mobile: String, mobileArea: String, password: String, callBack: callBack) 
    
    @available(swift 999.0)
    @objc func loginBy(email: String, password: String, callBack: callBack) 

有点取巧哈,本来·@available(swift 4.2)·是用来做Swift兼容的...这样之后就达到预期了。

0 人点赞