Bagaimana saya bisa membuka nilai opsional di dalam ikatan di Swift?


9

Saya membangun aplikasi menggunakan SwiftUI dan ingin cara untuk mengonversi Binding<Value?>menjadi Binding<Value>.

Di aplikasi saya, saya punya AvatarViewyang tahu cara membuat gambar untuk pengguna tertentu.

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

Aplikasi saya memiliki ContentViewyang memiliki dua binding: kamus pengguna berdasarkan id, dan id pengguna yang avatarnya harus kita tunjukkan.

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

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

Masalah: kode di atas tidak bergabung karena $userById[activeUserId]bertipe Binding<UserData?>dan AvatarViewmengambil a Binding<UserData>.

Hal yang saya coba ...

  • $userById[activeUserId]!tidak berfungsi karena sedang mencoba membuka Binding<UserData?>. Anda hanya dapat membuka Optional, bukan Binding<Optional>.

  • $(userById[activeUserId]!)tidak berfungsi karena alasan yang belum saya pahami, tetapi saya pikir sesuatu tentang $diselesaikan pada waktu kompilasi sehingga Anda sepertinya tidak bisa mengawali ekspresi sewenang-wenang dengannya $.


Apakah kamu sudah mencoba $userById[activeUserId] as! Binding<UserData>?
Kamran

Terima kasih untuk sarannya! Saya pikir itu mungkin akan bekerja dengan baik, tapi saya lebih suka tidak melakukan pemeran yang tidak aman. Ketika saya mencobanya saya mendapatkan peringatan membangun yang mengatakan "Cast from Binding <UserData?>
Ke

Jawaban:


10

Anda dapat menggunakan penginisialisasi ini , yang tampaknya menangani kasus persis ini - mengonversi Binding<T?>ke Binding<T>?:

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

Saya sudah terbiasa !memaksa membuka, seperti dalam upaya Anda, tetapi Anda bisa membuka yang nildiinginkan. Ekspresi Binding($userById[activeUserId])adalah tipe Binding<UserData>?.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.