我有模块数据。内部数据中有结构X。
struct X<T> {
var t: T
}
Y类里面有类型别名X
class Y {
typealias X = X<Int>
}
最后一个代码示例具有编译错误:
类型别名“ X”会引用自身
好的,编译器无法理解X是在Y之外定义的结构,它认为这是Y中的类型别名。我试图通过添加容器模块名称来具体化X。
class Y {
typealias X = Data.X<Int>
}
但是结果是,编译器给出了其他错误:
“ X”不是“数据”的成员类型
怎么可能? X是数据的成员。跳转到数据的定义后,我发现数据是Foundation中的struct。
我无法删除import Foundation
,因为我的代码使用了UUID和Date。是否可以解决此冲突而无需为Data.X创建不必要的类型别名?
(30.10.19) 在对当前问题有些困惑之后,我进行了以下实验。我这样做是为了避免与标准的Swift库交叉。希望本文能解决我的问题中所述的问题。
public struct B {}
public struct X { }
import A
import B
struct X { }
typealias Y = B.X
编译A,B,C之后,我有相同的错误(从语义的角度来看)。
“ X”不是“ B”的成员类型
答案 0 :(得分:0)
尝试将typealias
的名称从X
更改为x
,即
class Y {
typealias x = X<Int>
}
此外,Data
是 Swift 中的预定义类型。这就是为什么您得到“ X”不是“数据”成员类型错误的原因。
答案 1 :(得分:0)
以下情况解决了包含 A , B , C 项目的第二种情况下结构与模块之间的名称冲突。该解决方案基于我们只能编辑 C 项目的规则。因为 C 是我们假设的第三方不可更改模块 A 和 B 的客户。
import struct A.B
typealias StructB = B
import B
let structB: StructB? = nil
struct X { }
typealias Y = B.X
结果成功编译成功,没有错误:
“ X”不是“ B”的成员类型
我们可以在单个文件中使用模块 A 中的结构 B 和模块 B 中的结构。名称冲突已解决。
第二种情况解决了第一种情况下与 Data 的冲突。
import Foundation
使用
import struct Foundation.Date
import struct Foundation.UUID
#import <UIKit/UIKit.h>
。并将FOUNDATION_EXPORT
替换为extern
以进行Data.h编译。