- 环境**:
Swift〉= 2.3,Swift应用程序中的Swift框架
- 设置:**
- Swift动态框架,模块名为
APIService.framework
。 - 它有一个
public class APIService.swift
,并且有静态函数。 - 它有另一个
public class Item.swift
。 - 使用
APIService.framework
的快速应用程序 - 应用程序可与
APIService.function()
等框架配合使用 - 应用程序还具有
class Item.swift
如果应用程序需要引用框架的Item类,则必须执行APIService.Item
,但由于APIService是框架内的类,因此编译器始终尝试在APIService类内而不是在APIService模块中查找属性,因此抛出错误消息
'Item' is not a member type of 'APIService'
- 可能的解决方案:**
- 将框架的模块名称更改为类名以外的名称。
- 将类名更改为"模块名"以外的其他名称。
- 在APIService类中放置一个"Item"静态属性,该属性指向
框架中的项类。
所有这些都只是解决方法,真正的问题仍然是编译器不能区分模块名和类名。我们在Swift中有什么东西可以让我说"Don't look into the ModuleName.swift, instead look into the whole Module"
吗?
2条答案
按热度按时间lbsnaicq1#
基于this answer,看起来可以直接从模块导入单个类型来解决这个问题。
这样就可以直接引用
Item
而不会产生混淆。class
、protocol
、struct
、enum
和func
关键字(至少)适用于这种情况。wrrgggsh2#
这是Swift中符号名称冲突的老问题,因为编译器按照以下优先级顺序解析名称:
1.本地声明
1.导入的声明
1.导入的模块
您的应用的
Item
类名将覆盖从APIService
模块导入的类名,而APIService
类名将覆盖其模块名称,因此您无法再访问APIService.Item
。唯一的解决方案是将框架导入到一个清晰的命名空间(模块)中,而不会发生冲突和类型别名,然后将其重新导入到您的应用中。为此,您可以创建一个 Package 器框架,并在以下位置链接您的第三方库:
x一米四氮一x-〉x一米五氮一x-〉x一米六氮一x
让我们的
APIService
框架有实现:API服务.swift
制作
Dependencies
框架,将其与APIService
框架链接并添加此文件:依赖关系.swift
现在,您可以将
Dependencies
框架链接到您的应用中(APIService
会自动链接),并将库导入到您的代码中:应用程序swift
因此,正如您从测试中所看到的,我们可以访问
APIService.Item
类。