Как я могу развернуть необязательное значение внутри привязки в Swift? - PullRequest
5 голосов
/ 09 октября 2019

Я создаю приложение, используя SwiftUI, и хотел бы получить способ преобразования Binding<Value?> в Binding<Value>.

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

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

Мое приложение содержит ContentView, которому принадлежат две привязки: словарь пользователей по идентификатору и идентификатор пользователя, аватар которого мы должны показывать.

struct ContentView: View {
  @State var userById: Dictionary<Int, UserData>
  @State var activeUserId: Int

  var body: some View {
    AvatarView(userData: $userById[activeUserId])
  }
}

Проблема: приведенный выше код не объединяется, потому что $userById[activeUserId] имеет тип Binding<UserData?>, а AvatarView принимает Binding<UserData>.

То, что я пытался ...

  • $userById[activeUserId]! не работает, потому что пытается развернуть Binding<UserData?>. Вы можете развернуть только Optional, а не Binding<Optional>.

  • $(userById[activeUserId]!) не работает по причинам, которые я пока не понимаю, но я думаю кое-что о $ разрешается во время компиляции, поэтому вы не можете добавлять произвольные выражения к $.

1 Ответ

6 голосов
/ 09 октября 2019

Вы можете использовать этот инициализатор , который, кажется, обрабатывает именно этот случай - преобразование Binding<T?> в Binding<T>?:

var body: some View {
    AvatarView(userData: Binding($userById[activeUserId])!)
}

Я использовал !, чтобы принудительно развернутьКак и в ваших попытках, но вы можете развернуть nil так, как хотите. Выражение Binding($userById[activeUserId]) имеет тип Binding<UserData>?.

...