美文网首页Swift学习
Swift: 分别开放不同的接口给OC和Swift

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

作者: 韦弦Zhy | 来源:发表于2019-12-06 14:44 被阅读0次
    最近使用Swift编写Framework,遇到有一些方法想单独开放给OC,另一些单独开放给Swift使用,之所以有这样的想法都是归于Swift和OC存在一定的差异性,比如强大的Swift的枚举

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

        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合成一个并且看起来更加简洁的接口:
        enum LoginType {
            case mobile(_ mobile: String, mobileArea: String, password: String, callBack: callBack)
            case email(_ email: String, password: String, callBack: callBack)
        }
    

    统一接口:

        func login(by loginType:LoginType)
    

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

    swift调用
    可以看到调用的时候,新的接口确实更加简洁了,虽然最终传参还是一样长,但是毕竟统一且好看不少
    这时候我的问题来了,怎么在OC只暴露上面两个接口(默认就是这样),Swift只暴露单个统一的login接口(现在是三个),研究的半天,最终使用了一个很神奇的关键字: @available
        @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兼容的...这样之后就达到预期了。

    属性给OC和Swift设置不一样的名字
    • 创建一个单利,OC是 shareInstance, Swift 是shared,这样比较符合使用习惯
        @objc(shareInstance)
        public static let shared = ZYTestManager()
    

    相关文章

      网友评论

        本文标题:Swift: 分别开放不同的接口给OC和Swift

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