在Swift属性包装器的实现中,访问被包装对象的名称

20

我正在使用Swift属性包装器来定义类似于:

@MyWrapper var foo: Int
在实现属性包装器时,我希望能够将变量名foo作为字符串来访问。类似这样:

And in the implementation of the property wrapper, I'd like to access the name of the variable, foo, as a string. Something like this:

@propertyWrapper
public struct MyWrapper<Type> {
  init() {
    // Get access to "foo" -- name of var as String
  }
}

有什么建议吗?


我几乎可以确定这方面没有API可供使用。 - Alexander
这可能是一个xy问题吗?真正的目标是什么? - matt
3
“xy”问题?在@propertyWrapper的实现中,我需要一个名称来存储数据,比如在用户默认设置中 - 与此属性相关。我可以(并正在这样做)将名称作为初始化参数传递。但是,至少给一个参数默认值似乎更清晰,该默认值是变量的名称。 - Chris Prince
我处于类似的情况。你找到答案了吗? - Dustin Pfannenstiel
不幸的是,没有。需要像#var这样的东西,类似于#function(请参见https://dev59.com/MWAf5IYBdhLWcg3wqUON)。我需要在Swift开发者论坛上发布这个问题。 - Chris Prince
显示剩余2条评论
1个回答

1

要将变量名称传递给包装器,您可以使用这种替代方式。

@propertyWrapper
public struct MyWrapper<Type> {

  var wrappedValue: ... {
  set{.....}
  get{.....}
  }

  init(wrappedValue initialValue: Double, _ nameOfTheVariable: String ) {
      precondition(!nameOfTheVariable.isEmpty)
      //you can access nameOfTheVariable here
  }  
}

然后像下面这样使用它,
   @MyWrapper("foo") var foo: Int

注意:在 init 方法中提到 wrappedValue 是必须的。否则,对我没有作用。
(init(wrappedValue initialValue: Double, _ nameOfTheVariable: String))

1
感谢您的想法,@Yodagama。但是,这并不完全是我要求的。这不是“变量名”确切地说。它是作为参数传递的另一个字符串。它在符号上不够好,并且包装器的API用户必须知道要传递什么--变量的冗余名称。 - Chris Prince
@ChrisPrince 是的,我同意。 - YodagamaHeshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接