Как отобразить текстовое представление в быстром пользовательском интерфейсе, если переменная не равна нулю? - PullRequest
1 голос
/ 08 мая 2020

Это в основном мой код:

var myString: String?

var body: some View {
  NavigationView {
    if myString != nil {
      CustomView(text: myString ?? "")
    }
  }
}

Если я попробую без добавления части ?? "", он не сработает, говорит Value of optional type 'String?' must be unwrapped to a value of type 'String'. Если я добавлю его, как показано выше, он, похоже, сработает, но зачем мне иметь значение пустой строки по умолчанию, если этого никогда не будет? (Поскольку этот код будет достигнут только в том случае, если myString не nil) Есть ли способ сделать этот код более чистым?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вам нужно использовать необязательную привязку, чтобы развернуть безопасную необязательную переменную. Однако простое использование этого внутри body приведет к ошибке компилятора, потому что не весь поток управления (включая if let) разрешен внутри body представления, поэтому вам нужно обернуть его в другое вычисляемое свойство.

struct MyView: View {

    var myString: String?

    var body: some View {
      NavigationView {
        innerView
      }
    }

    var innerView: some View {
        if let myString = myString {
            return AnyView(CustomView(text: myString))
        } else {
            return AnyView(EmptyView())
        }
    }
}

Или вы можете упростить это, используя Optional.map.

struct MyView: View {
    var myString: String?

    var body: some View {
      NavigationView {
        myString.map { CustomView(text: $0) }
      }
    }
}
0 голосов
/ 08 мая 2020
if let myString = myString {
  CustomView(text: myString)
}

Это один из способов безопасно развернуть необязательный элемент, но, как было указано, он не будет работать внутри блока построения представления. Вместо этого вы можете использовать map, чтобы упростить задачу.

var myString: String?

var body: some View {
  NavigationView {
    myString.map { CustomView(text: $0) }
  }
}
...