Swift'te bir ciltleme içinde isteğe bağlı bir değeri nasıl açabilirim?


9

SwiftUI kullanarak bir uygulama geliştiriyorum ve Binding<Value?>a Binding<Value> ' ya dönüştürmenin bir yolunu istiyorum .

Benim app AvatarViewbelirli bir kullanıcı için bir görüntü oluşturmak için nasıl bilen bir var.

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

Uygulamam ContentViewiki bağlamaya sahip bir tutar : kimliğe göre kullanıcıların bir sözlüğü ve avatarını göstermemiz gereken kullanıcının kimliği.

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

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

Sorun: Yukarıdaki kod, $userById[activeUserId]tür olduğundan Binding<UserData?>ve AvatarViewa Binding<UserData>.

Denediğim şeyler ...

  • $userById[activeUserId]!çalışmıyor çünkü a Binding<UserData?>. Sadece anı açabilirsin Optional, değil Binding<Optional>.

  • $(userById[activeUserId]!)henüz anlamadığım nedenlerle çalışmıyor, ama sanırım hakkında bir şey $derleme zamanında çözüldü, bu yüzden rastgele ifadelerin önekini kullanamazsınız $.


Denedin $userById[activeUserId] as! Binding<UserData>mi
Kamran

Önerin için teşekkürler! Muhtemelen işe yarayacağını düşünüyorum, ancak güvensiz bir oyuncu seçmemeyi tercih ederim. Ben denediğimde "Bağlama <UserData?> Cast ilgisiz tip Bağlama <UserData>" bir yapı uyarısı alıyorum
rjkaplan

Yanıtlar:


12

Sen kullanabilirsiniz Bu Başlatıcı tam bu durumda işlemek gibi görünüyor - dönüştürme Binding<T?>için Binding<T>?:

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

Ben de !sizin denemenizde olduğu gibi, açmaya zorladım, ama istediğiniz gibi açabilirsiniz nil. İfade Binding($userById[activeUserId])türdedir Binding<UserData>?.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.