Попытка создать оболочку для свойства, которое должно корректировать строку - PullRequest
1 голос
/ 29 января 2020

У меня есть этот код, который мне нужно использовать в других приложениях.

Этот код показывает сообщения, в которых присутствует имя локализованного приложения.

Итак, у меня есть локализованные строки, такие как:

"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:

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

Я также пытался использовать эту строку

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

Та же ошибка ...


Строка может содержать имя приложения более одного раза. Вот почему у меня есть это расширение до String.

1 Ответ

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

Чтобы решить эту проблему, ваша оболочка свойства не может иметь тип c типа «Строка», поскольку он скрывает встроенный тип «Строка», к которому принадлежит ваше расширение. Поэтому измените объявление struct, чтобы оно не было обобщенным c

@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)
  }
...