#if 语句到 Swift 中的宏数组

#if statment to array of macros in Swift

我将 TARGETS -> Target's Name -> Build Settings -> Other Swift Flags 下的目标宏设置为 'Target#1',将另一个目标设置为 'Target#2'。现在我有一个 #if 语句来检查哪个目标当前是 运行 我想对每个目标做一些不同的事情,它是这样的:

#if Target#1 || Target#2
DoSomething()
#endif

#if Target#1
DoSomething()
#elseif Target#2
DoSomethingElse()
#endif

我想要做的是让在代码中的一个地方而不是多个位置编辑更容易一些,而不是向每个 #if 语句添加目标名称,我只想检查宏是否在宏数组中。类似的东西:

#define TARGETS_FOR_OPTION_1 [Target#1, Target#2, Target#3]
#define TARGETS_FOR_OPTION_2 [Target#4, Target#5, Target#6]

#if TARGETS_FOR_OPTION_1
DoSomething()
#elseif TARGETS_FOR_OPTION_2
DoSomethingElse()
#endif

在 Swift 中可以吗?

与其将条件检查分散到整个代码库,不如使用 Replace Conditional with Polymorphism 技术进行重构。

  1. 制定一个协议,描述需要在不同上下文之间以不同方式完成的操作
  2. 对于您需要支持的每个上下文,实现协议的一种一致性
  3. 创建一个拥有在各种对象之间进行选择的“切换逻辑”的集中位置。它将包含您所有的宏。
  4. 代码库的所有其他区域仅使用切换逻辑来获取适合上下文的对象(他们不需要知道这到底意味着什么),他们可以调用其方法。

假设该示例在 Windows、macOS 和 Linux 上调用系统 API。您可能有 3 个符合您的“SystemAPI”协议,每个都调用系统特定的逻辑。因此,您需要确保 windows 文件只是您的 windows 目标的一个成员,macOS 文件只是您的 macOS 目标的一个成员,等等。

或者,您可以让所有文件成为所有目标的成员,但您需要将它们的内容包装在 #if/#endif 中,这样它们对于目标来说实际上是空的他们的目标。

此外,在包含切换逻辑的文件中,您需要使用这些条件来过滤掉对不存在的代码的引用。例如。 Linux 目标无法引用 Windows 一致性(因为它不存在)