【问题标题】:#if statment to array of macros in Swift#if 语句到 Swift 中的宏数组
【发布时间】:2021-10-26 14:24:51
【问题描述】:

我将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 中可行吗?

【问题讨论】:

  • 这与集中检查任何其他类型的条件(不一定是宏)没有什么不同。你在一个地方做一次,从一组对象中挑选一个对象。您将所有条件行为放在这些对象的方法中。从那时起,您只需调用您需要的方法,多态性将有利于您根据您的清晰环境调用正确的方法实现。
  • 不同之处在于如果我想排除某些文件编译到特定目标。在您的方法中,我需要在所有目标中编译项目的所有文件,使用 Macro #if 语句将允许我从编译中排除一些文件。对不对?
  • 不,您只会在它们所属的目标中包含文件(使用 Xcode 右侧的侧边栏)。具有“切换逻辑”的文件是唯一需要宏来删除依赖于特定目标类的部分的文件
  • 好的,我明白你的意思,在“切换逻辑”文件中执行宏#if 语句,让每个人都叫他。很好的解决方案... :) 谢谢!您可以将其添加为答案,我会接受。
  • IDK 如何将其总结为一个好的答案,这只是基本的多态性。但我会总结一下,我猜

标签: ios arrays swift macros


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多