ฉันจะแกะค่าตัวเลือกภายในการรวมใน Swift ได้อย่างไร


9

ฉันกำลังสร้างแอปโดยใช้ SwiftUI และต้องการเปลี่ยนเป็นBinding<Value?>a Binding<Value>

ในแอพของฉันมีสิ่งAvatarViewที่รู้วิธีการแสดงภาพสำหรับผู้ใช้เฉพาะ

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

แอพของฉันมีContentViewสองสิ่งที่เป็นเจ้าของ: พจนานุกรมของผู้ใช้ตาม ID และรหัสของผู้ใช้ที่เราควรแสดงอวาตาร์

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?>และจะใช้เวลาในAvatarViewBinding<UserData>

สิ่งที่ฉันพยายาม ...

  • $userById[activeUserId]!Binding<UserData?>ไม่ได้เพราะมันพยายามกับแกะ คุณสามารถแกะไม่OptionalBinding<Optional>

  • $(userById[activeUserId]!)ไม่ทำงานสำหรับเหตุผลที่ฉันยังไม่เข้าใจ แต่ผมคิดว่าบางสิ่งบางอย่างเกี่ยวกับการแก้ไขที่รวบรวมเวลาเพื่อให้คุณไม่สามารถดูเหมือนจะคำนำหน้าโดยพลการแสดงออกด้วย$$


คุณลอง$userById[activeUserId] as! Binding<UserData>ไหม
Kamran

ขอบคุณสำหรับคำแนะนำ! ฉันคิดว่ามันอาจจะใช้ได้ดี แต่ฉันไม่ต้องการแสดงนักแสดงที่ไม่ปลอดภัย เมื่อฉันลองฉันจะได้รับคำเตือนการสร้างว่า "Cast จาก Binding <UserData?> เป็น Binding <UserData> ที่ไม่เกี่ยวข้อง>"
rjkaplan

คำตอบ:


10

คุณสามารถใช้ผู้เริ่มต้นนี้ซึ่งดูเหมือนจะจัดการกับกรณีที่แน่นอนนี้ - แปลงBinding<T?>เป็นBinding<T>?:

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

ฉันเคย!บังคับฝืนเหมือนในความพยายามของคุณ แต่คุณสามารถแกะตามที่nilคุณต้องการ การแสดงออกเป็นประเภทBinding($userById[activeUserId])Binding<UserData>?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.