如何解决结构名和模块名之间的冲突?

时间:2019-10-23 06:22:53

标签: swift

我有模块数据。内部数据中有结构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库交叉。希望本文能解决我的问题中所述的问题。

  • 使用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”的成员类型

2 个答案:

答案 0 :(得分:0)

尝试将typealias的名称从X更改为x,即

class Y {
    typealias x = X<Int>
}

此外,Data Swift 中的预定义类型。这就是为什么您得到“ X”不是“数据”成员类型错误的原因。

答案 1 :(得分:0)

以下情况解决了包含 A B C 项目的第二种情况下结构与模块之间的名称冲突。该解决方案基于我们只能编辑 C 项目的规则。因为 C 是我们假设的第三方不可更改模块 A B 的客户。

  1. 使用以下代码将新的Swift文件添加到 C 项目中
import struct A.B
typealias StructB = B
  1. 将Src.swift中的代码更改为以下内容
import B
let structB: StructB? = nil

struct X { }
typealias Y = B.X

结果成功编译成功,没有错误:

  

“ X”不是“ B”的成员类型

我们可以在单个文件中使用模块 A 中的结构 B 和模块 B 中的结构。名称冲突已解决。


第二种情况解决了第一种情况下与 Data 的冲突。

  1. 替换
import Foundation

使用

import struct Foundation.Date
import struct Foundation.UUID
  1. 确保未在模块级别导入Foundation。就我而言,我从Data.h中删除了#import <UIKit/UIKit.h>。并将FOUNDATION_EXPORT替换为extern以进行Data.h编译。