尝试为应该调整字符串的 属性 制作包装器

Trying to make a wrapper for a property that should adjust a string

我有这段代码需要让其他应用程序可以重复使用。

此代码显示包含本地化应用程序名称的消息。

所以,我有这样的本地化字符串:

"DoYou" = "Do you really want to close $$$?";
"Quit" = "Quit $$$";
"Keep Running" = "Keep $$$ Running";

其中 $$$ 必须在 运行 时替换为本地化应用程序的名称。

因为我想了解 属性 包装器,所以我尝试创建这个:

extension String {

  func findReplace(_ target: String, withString: String) -> String
  {
    return self.replacingOccurrences(of: target,
                                     with: withString,
                                     options: NSString.CompareOptions.literal,
                                     range: nil)
  }
}


  @propertyWrapper
  struct AdjustTextWithAppName<String> {
    private var value: String?


    init(wrappedValue: String?) {
      self.value = wrappedValue
    }

    var wrappedValue: String? {
      get { value }
      set {
        if let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String {
          let replaced = value.findReplace("$$$", withString: localizedAppName)

        }
        value = nil
      }
    }

  }

我在 replaced 行收到此错误:

Value of type String? has no name findReplace

我也试过用这条线

 let replaced = value!.findReplace("$$$", withString: localizedAppName)

同样的错误...


该字符串可能多次包含应用程序的名称。这就是为什么我将扩展名 String.

为了解决这个问题,您的 属性 包装器不能有一个名为 String 的通用类型,因为它隐藏了您的扩展所属的内置类型 String。因此,将 struct 声明更改为非通用

@propertyWrapper
struct AdjustTextWithAppName {

或将类型命名为其他名称

@propertyWrapper
struct AdjustTextWithAppName<T> {

并修复 set 方法

set {
    guard let str = newValue, let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String else {
        value = nil
     } 

     value = str.findReplace(target: "$$$", withString: localizedAppName)
  }