从我的项目和一个pod

时间:2018-02-15 13:35:02

标签: objective-c swift swift4

在我的项目和pod框架的两个不同类之间,解决类命名是否存在冲突?

我认为最好的解决方案是我的项目默认使用自己的Product类,除非我写Tracker.Product

上下文......

在我的项目中,我有一个Objective-C类:

@interface Product : DatabaseObject { /* ... */ }

我想要使用的框架声明:

public class Product : BusinessObject { /* ... */ }

问题是,只要我在我的一个Swift文件中导入库,就像这样:

import Tracker

错误......

我在试图使用Product : DatabaseObject

的Swift文件中收到此错误

enter image description here

我猜两个名字之间存在冲突,但这很奇怪,因为我在使用Product的每个swift文件中都有此错误,即使是没有import Tracker的文件也没有。

我尝试了什么

  • 重命名一个类:它有效,但不好/悲伤的解决方案
  • 将Framework类更改为internal:无法工作,因为它使用此类类型公开公共方法
  • 发现可以按Apple doc中所述进行typealias导入,但无法使其适用于我的案例

额外问题 ... (永不满足的好奇心)

  • 您知道为什么import Tracker会影响所有其他swift文件吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

首先,你的额外问题......

Swift命名空间是按模块进行的。将名称ProductTracker引入一个文件后,名称就会存在于整个模块中。 (虽然由于某种原因你仍然需要将外部模块导入到你想要实际使用模块的每个文件中,但我不知道为什么会这样......)

现在您发现两个Product名称冲突......

Objective-C类的传统是在它们上面加上三个字母的前缀。这一直是因为Objective-C中只有一个命名空间。只有一个命名空间,Product的多个版本的可能性变得非常高。 Apple保留两个字母的前缀,这就是为什么你会看到像NSStringUIViewController等的东西.Apple使用“NS”或框架名称的缩写来表示它们的所有前缀。个别开发人员和公司传统上使用他们自己的首字母,公司名称缩写,或者在框架和库的情况下使用相应名称的缩写。

由于您遇到碰撞问题的类是Objective-C类,最简单的方法是遵循传统并在其上添加前缀。它不是很像Swift,但它不是Swift类,它是Objective-C类...