使Swift OSS库与Objective-C兼容

问题描述 投票:4回答:2

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

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

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

  • 泛型
  • 结构
  • 所有Swift类都必须来自NSObject

所以我的两个问题是:

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

我很感激这里的所有帮助。

ios objective-c swift
2个回答
5
投票

Objective-C中没有最全面的Swift功能列表位于Apple的Swift Type CompatibilityUsing Swift with Cocoa and Objective-C guide部分。

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

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

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

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


0
投票

事先要了解更多事情。

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

所以api比用目标c写的更有限,因为它支持泛型(虽然人们喜欢说不是真正的泛型等等)而且不能扩展你在api中提供的任何类也可能是非常有限的,但它仍然可行。

你只需要将@objc放在任何地方,编译器会很快地告诉你什么不支持。另外,有时候施法可能非常棘手......我最终会像这样投射,因为我在swift代码中从swift中恢复了目标c泛型类

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

这是工作代码,但直接演员是不可能的。

最好是为swift编写纯swift并根据需要使用目标c libs,否则你将努力编写一行代码。 (像我这样的 :))

© www.soinside.com 2019 - 2024. All rights reserved.