为什么这个结构隐藏了 String 类型?

Why this struct shadows the type String?

我正在尝试了解 属性 包装器。

我有另一个关于 SO 的问题,我试图创建一个 属性 包装器,如下所示:

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
      }
    }

  }

这行不通,因为行 value.findReplace 显示错误

Value of type String? has no name findReplace

一旦有人建议我将结构行更改为

struct AdjustTextWithAppName {

整个事情开始工作了。

为什么?我无法理解为什么结构上的 <String> 项会影响我创建的 String 类型的扩展。

这是为什么?

I cannot understand why <String> term on the struct was shadowing the extension to the String type I have created.

为什么不呢?您明确要求 AdjustTextWithAppName 有一个名为 String 的泛型类型参数。编译器准确地为您提供了您所要求的内容。

<String> 替换为常见的通用类型 <T>,您会立即看到问题

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


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

    var wrappedValue: T? {
      get { value }
      set {
        if let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String {
            let replaced = value.findReplace("$$$", withString: localizedAppName) // Value of type 'T' has no member 'findReplace'

        }
        value = nil
      }
    }
  }

现在错误更容易理解了

Value of type 'T' has no member 'findReplace'