【问题标题】:using C macros in Swift, when the initializer isn't a compile time constant当初始化器不是编译时常量时,在 Swift 中使用 C 宏
【发布时间】:2017-08-21 17:57:58
【问题描述】:

我有一个 Strings.h 文件,其中包含许多条目,例如:

#define HIDE_WORD NSLocalizedString(@"Hide", @"the word on a button to Hide a screen that is showing")

如何使这些宏对 Swift 可用,或者如果我不能使宏可用,有什么替代方法?将我想要的宏包装在 Swift 中的类方法中的最佳方法是什么?

This answer 在我的情况下不起作用,因为 NSLocalizedString(@"Foo", @"Bar") 不是常量。

【问题讨论】:

  • 您的链接只是指向问题。 stackoverflow.com/a/26709119/278842 不适合你吗?
  • 使用宏来缩短代码是不好的代码风格。如果本地化正确完成,则一个字符串永远不会使用两次(绝对不会使用相同的注释),因此我认为甚至没有必要首先拥有一个全局字符串文件。正确的解决办法是到处手动写NSLocalizedString
  • @ChristopherOezbek 这就是我正在做的(那个不被接受的答案),我想知道是否有更好的东西。
  • @Sulthan 很有趣。如果我在代码中的多个位置对 UIBarButtonItem 标题使用“隐藏”一词会怎样?看起来评论会是一样的吗?在这种情况下,您的意思是我应该在 MyStyles 类中创建整个 UIBarButtonItem 实例化并调用它而不是使用标题的宏?如果出于某种原因我在 UIBarButtonItem 和 UIButton 中都使用了 Hide 这个词怎么办?
  • @AndrewJohnson 如果按钮总是做同样的事情,那么你没有理由在不同的地方重复创建模式。如果按钮在某处做了一些稍微不同的事情,那么它应该有一个单独的注释。维护单独的字符串文件的问题在于,当功能更改时,它几乎永远不会更新,因此您会得到未使用的字符串、过时的 cmets 等。

标签: objective-c swift


【解决方案1】:

由于无法在不编辑代码的情况下将这些字符串自动导入 Swift,因此您不妨将所有数据直接放入 Swift。

这个正则表达式方法怎么样?

搜索

\#define (\w*) NSLocalizedString\(@"([^"]*)", *@"([^"]*)"\)

替换

let $1 = NSLocalizedString\("$2", comment: "$3"\)

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 2011-09-02
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2012-08-31
    相关资源
    最近更新 更多