Почему эта структура скрывает тип String? - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь понять оболочки свойств.

У меня есть еще один вопрос на 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 показывается ошибка

Значение типа String? не имеет имени findReplace

Как только кто-то предложил мне изменить строку структуры на

struct AdjustTextWithAppName {

, все это начало работать.

Почему? Я не могу понять, почему термин <String> в структуре скрывал расширение созданного мной типа String.

Почему это так?

Ответы [ 2 ]

1 голос
/ 29 января 2020

Замените <String> на общий тип c type <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
      }
    }
  }

Теперь ошибка более понятна

У значения типа 'T' нет члена 'findReplace'

0 голосов
/ 29 января 2020

Я не могу понять, почему термин <String> в структуре скрывал расширение созданного мной типа String.

Почему бы и нет? Вы явно запросили наличие параметра типа c для AdjustTextWithAppName с именем String. Компилятор дал вам именно то, что вы просили.

...