Як я можу розгортати необов'язкове значення всередині прив'язки у Swift?


9

Я будую додаток, використовуючи SwiftUI, і я хотів би спосіб перетворити a Binding<Value?>в a 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]!)не працює з причин, які я ще не розумію, але я думаю, що щось $вирішено під час компіляції, тому ви, здається, не можете префіксувати довільні вирази $.


Ви пробували $userById[activeUserId] as! Binding<UserData>?
Камран

Дякую за пропозицію! Я думаю, це, мабуть, спрацювало б добре, але я вважаю за краще не робити небезпечну ролю. Коли я спробую це, я отримую попередження про
збірку із закликом

Відповіді:


10

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.