【问题标题】:Converting an Objective-C #define macro to Swift将 Objective-C #define 宏转换为 Swift
【发布时间】:2016-01-27 17:42:56
【问题描述】:

我在一个 Objective-C 项目中有一个宏,可以缩短输入长引用的时间:

#define CURRENT_USER DataConnector.sharedInstance.currentUser

这允许我通过 CURRENT_USER 代替 ^ 来引用当前用户。

我将如何在 Swift 中复制它?我试过this suggested let solution,但这似乎实际上创建了一个不可变的变量。改用var 合适吗?如果 #define 改为:

#define CONST_STR = static NSString* const

...可以像这样使用:

CONST_STR kXXSomeConstant = @"a constant string";

Swift let(或var?)解决方案能否以同样的方式使用?

【问题讨论】:

  • 不,我不是在问 如何 在 Swift 中创建一个常量字符串。请阅读问题谢谢。
  • 宏太可怕了。它们不是类型安全的,会使调试成为一场噩梦。如果你真的经常使用特定的代码行来制作它的宏,那么你可能首先做错了什么。如果我用 Swift 重写我的代码,我会试图找到一个不是“宏的 Swift 版本”的解决方案。
  • @originaluser2 现在我可以落后了。我同意,我实际上并不打算在任何地方使用它,但我绝对想了解在 Swift 中是否有办法做到这一点,如果没有,为什么。
  • 使用#define 是不好的做法,应该使用const,这使得如何使用不言自明

标签: ios objective-c swift macros


【解决方案1】:

据我了解,Swift 编译器不使用 C 预处理器,因此根本不可能使用宏。像其他评论者一样,我建议找到一种更快速的方式来处理这种情况。正如@originaluser2 在他/她的评论中指出的那样,宏有一个严重的缺点。 (更不用说在 Swift 中完全不支持的致命缺陷了。)

【讨论】:

  • 接受,因为你确实回答了我问的问题;)
【解决方案2】:

您应该能够使用带有自定义 getter 的 var:

var CURRENT_USER : User {
    return DataConnector.sharedInstance.currentUser
}

【讨论】:

  • 对,我意识到我可以做到,但它仍在评估它; Objective-C #define 实际上创建了一个在编译时替换的编译器宏,不是吗?
  • 是的,但是与评估 DataConnector.sharedInstance.currentUser 的开销相比,对这个简单函数的单次调用(几乎可以肯定地优化到根本不调用)的开销是可以忽略不计的。
  • Swift 不支持预处理器宏,如果没有这些,这几乎是最好的选择。
  • @remus:您的 Objective-C 宏在每次使用时也会扩展为一个方法调用。
  • 宏纯粹是为了方便。它们在运行时的效率通常低于函数调用,因为正如 David 所说,它们只是内联复制粘贴原始代码。再加上完全缺乏类型安全性和无法调试使它们使用起来很痛苦(如 originaluser2 所述)。坦率地说,我很高兴 Swift 不支持它们。就像表达的那样,很好地摆脱了糟糕的垃圾。
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多