使Swift OSS库与Objective-C兼容

时间:2017-02-22 20:45:12

标签: ios objective-c swift

我正在Swift中构建一个库,它必须支持Objective-C。

我已经检查了this answer,它建议在Objective-C中编写库,但是给我的要求是在Swift中编写库。我以源代码形式提供库,因此在我的情况下不应该适用那些关于不稳定ABI的论点(反对在Swift中编写库)。

所以我听说为了让这个Swift库适用于Objective-C,我将不得不避免使用Swift中的Objective-C中没有的高级功能。这些例子包括:

  • 泛型
  • 的Structs
  • 所有Swift类必须来自NSObject

所以我的两个问题是:

  1. 我在哪里可以找到这些限制的详尽列表?
  2. 如何快速测试我的库与Objective-C兼容?我对Swift和Objective-C的互操作性主题一点也不熟悉。我在网上找不到很多文章。官方Apple文档是否足够?哪些部分可以帮忙?
  3. 我很欣赏这里的所有帮助。

2 个答案:

答案 0 :(得分:5)

目标-C未提供的最全面的Swift功能列表位于Apple Swift Type CompatibilityUsing Swift with Cocoa and Objective-C guide部分。

从那里引用,排除列表如下:

  • 泛型
  • 元组
  • 在没有Int原始值的Swift中定义的枚举 输入
  • Swift中定义的结构
  • Swift中定义的顶级函数
  • Swift中定义的全局变量
  • Swift中定义的Typealiases
  • Swift式variadics
  • 嵌套类型
  • 咖喱功能

whole guide值得一读,但我要特别注意Mix and Match section,它描述了从Objective-C调用Swift,反之亦然,包括外部框架。

我肯定会建议做@Mike Taverne建议:在Objective-C中进行一系列单元测试,它们运用你在Swift中开发的API。这是确保一切按预期工作的最佳方式。

答案 1 :(得分:0)

还有很多事要事先知道。

  1. 您不能按目标c类扩展swift类。
  2. 您不能在通用swift类或方法上使用@objc(尽管您可以在方法上的@objc swift类中使用泛型)

因此,与使用目标c编写的api相比,它会受到更多限制,因为它支持泛型(尽管人们喜欢说不是真正的泛型等),并且无法扩展您在api中提供的任何类都可以也有很大的局限性,但仍然可行。

您只需要在所有地方放置@objc,编译器就会很快告诉您不支持的内容。有时候,强制转换也很棘手……我最终像这样强制转换,因为我是从swift代码中快速获取目标c泛型类

as! CSResponse<AnyObject> as! (CSResponse<AnyObject> & CSListData) 

这是有效的代码,但是直接强制转换是不可能的。

最好是为swift编写纯swift,并根据需要使用目标c库,否则您将奋力编写一行代码。 (就像我一样:))