【发布时间】:2019-10-23 06:22:53
【问题描述】:
我有模块数据。内部数据我有 struct X。
struct X<T> {
var t: T
}
类 Y 里面有 typealias X
class Y {
typealias X = X<Int>
}
最后一个代码示例有编译错误:
类型别名“X”引用自身
好的,编译器无法理解 X 是在 Y 之外定义的结构,它认为这是 Y 中的类型别名。我试图通过添加容器模块名称来具体化 X。
class Y {
typealias X = Data.X<Int>
}
但结果,编译器给出了其他错误:
“X”不是“数据”的成员类型
这怎么可能? X 是数据的成员。跳转到 Data 的定义后,我发现 Data 是 Foundation 中的结构体。
我无法删除 import Foundation,因为我的代码使用了 UUID 和日期。是否可以在不为 Data.X 创建不必要的类型别名的情况下解决此冲突?
(30.10.19) 在对当前问题有些困惑之后,我做了以下实验。我这样做是为了避免与标准 Swift 库有任何交叉。希望这篇笔记能更清楚地解决我的问题中描述的问题。
- 使用 Src.swift 创建项目 A
public struct B {}
- 使用 Src.swift 创建项目 B
public struct X { }
- 使用 Src.swift 创建项目 C
import A
import B
struct X { }
typealias Y = B.X
编译 A、B、C 后,我有同样的错误(从语义的角度来看)。
“X”不是“B”的成员类型
【问题讨论】:
-
您的模块名称完全错误。编译器如何区分你的模块和原生模块?
-
@Karman “怎么样?”这是关于政治的问题。作为替代方案,编译器可以给予模块名称比结构名称更高的优先级(即使它是本机的)。在这种政治中,我可以具体化 Foundation.Data。
-
其实使用同名有很多问题。离开编译器,没有新开发者会知道这是模块
Data还是FoundationData。这是不现实的。命名约定不允许这样做。 -
@Kamran 这与命名约定无关,它与看起来像语义错误的编译错误有关。模块和类型不能在同一个上下文中使用,我无法想象新开发人员如何混淆模块和类型。但是编译器还不清楚,我正在寻找方法来清除它。
-
@Kamran 我检查了我可以很容易地解决结构的名称冲突。我在两者中都使用代码
public class Data { }创建了模块A 和B。我用代码print(A.Data.self); print(C.Data.self); print(Foundation.Data.self)创建了模块C。所有模块都编译成功。对于编译器和新开发人员来说,正在使用哪些数据是很清楚的。我试图找到的解决方案对于新开发人员来说是显而易见的。但正如我所见,不存在任何解决方案。是真的吗?
标签: swift