【问题标题】:How to use a Typealias or Closure to define a constant with a parameter for name in swift?如何使用 Typealias 或 Closure 在 swift 中定义一个带有 name 参数的常量?
【发布时间】:2025-12-05 09:40:01
【问题描述】:

在 Objective C 中,我曾经使用 #defines 来定义常量,作为一种快速明确地定义本地化字符串并保持代码更简洁的方法。

例如:

#define DefineStringKey(x) static NSString *const x = @#x

这将让我在与字符串命名相同的常量中定义 所以DefineStringKey(@"IntroTitle"); 将创建一个名为 IntroTitle 的常量,其值 IntroTitle 我可以在我的代码中引用(自动完成和所有)。

我有一个想法,我可以在 Swift 中做同样的事情,但我似乎无法使用 typealias 或闭包来获得正确的语法。

类型别名

typealias DefineStringKey:(x:String) = let x:String = x 

关闭

let DefineStringKey:(String) = (String) -> () {
   (x:String) in
   let x:(String) = x
}

显然我给出的两个例子都不正确。这是我可以通过另一种方法在 Swift 中做的事情,还是我的语法刚刚结束。

编辑添加了一个用例。

【问题讨论】:

  • #define 是一个预编译器指令。你所有的 Swift 尝试都是运行时的。为什么不展示一个清楚的例子来说明您打算如何使用这些常量。那么有人可能会提供一个好的解决方案。
  • 目前还不清楚您要达到的目标。 key 是什么?你想要什么 ?如果它是一个简单的常数值,为什么需要 typealias ?无论如何,closures 不是这样工作的
  • @rmaddy 根据您的建议添加了一个示例。
  • @Andrew21111 'key' 在这种情况下是我想设置的字符串名称和值。我更改了帖子以反映我在 Objective C 示例中所写的内容。

标签: swift


【解决方案1】:

不幸的是,Swift 没有宏,所以你不能在不写出let myConstant = ... 的情况下定义一个常量(或变量)。你可以做的是使用一个闭包来定义一个你可以在闭包的内部范围内使用的常量:

func defineStringKey(_ key: String, handler: (String) -> Void) {
    handler(key)
}

把它放在全局范围内的任何地方,你可以像这样使用它:

defineStringKey("IntroTitle") { IntroTitle in
    print(IntroTitle)
}

打印出IntroTitle。虽然这不是很有用,我不建议使用它。在 swift 中,您必须明确输入变量定义。

【讨论】:

  • 感谢您的解释!我将明确输入所有内容以在我的新版本中保持相同的功能。