最近使用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
合成一个并且看起来更加简洁的接口:
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
@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兼容的...这样之后就达到预期了。