最近使用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中有三个接口:
可以看到调用的时候,新的接口确实更加简洁了,虽然最终传参还是一样长,但是毕竟统一且好看不少
这时候我的问题来了,怎么在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()
网友评论