Làm cách nào tôi có thể mở ra một giá trị tùy chọn bên trong một ràng buộc trong Swift?


9

Tôi đang xây dựng một ứng dụng bằng SwiftUI và muốn có cách chuyển đổi Binding<Value?>thành Binding<Value>.

Trong ứng dụng của mình, tôi có một AvatarViewcái mà biết cách kết xuất hình ảnh cho một người dùng cụ thể.

struct AvatarView: View {
  @Binding var userData: UserData

  ...
}

Ứng dụng của tôi có một ContentViewliên kết sở hữu hai ràng buộc: từ điển người dùng theo id và id của người dùng có hình đại diện mà chúng ta sẽ hiển thị.

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

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

Vấn đề: đoạn mã trên không kết hợp vì $userById[activeUserId]thuộc kiểu Binding<UserData?>AvatarViewlấy trong a Binding<UserData>.

Những điều tôi đã thử ...

  • $userById[activeUserId]!không làm việc vì nó đang cố gắng để unwrap một Binding<UserData?>. Bạn chỉ có thể mở khóa một Optional, không phải a Binding<Optional>.

  • $(userById[activeUserId]!)không hoạt động vì những lý do mà tôi chưa hiểu, nhưng tôi nghĩ điều gì đó $được giải quyết vào thời gian biên dịch để bạn dường như không thể thêm tiền tố vào các biểu thức tùy ý $.


Bạn đã thử $userById[activeUserId] as! Binding<UserData>chưa
Kamran

Cám ơn vì sự gợi ý! Tôi nghĩ rằng nó có thể sẽ hoạt động tốt, nhưng tôi không muốn làm một diễn viên không an toàn. Khi tôi dùng thử, tôi nhận được một cảnh báo xây dựng có nội dung "Truyền từ Binding <UserData?> Đến loại Binding không liên quan <UserData>"
rjkaplan

Câu trả lời:


10

Bạn có thể sử dụng trình khởi tạo này , dường như để xử lý trường hợp chính xác này - chuyển đổi Binding<T?>thành Binding<T>?:

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

Tôi đã từng !ép buộc unrap, giống như trong các nỗ lực của bạn, nhưng bạn có thể mở khóa theo cách nilbạn muốn. Các biểu thức Binding($userById[activeUserId])là loại Binding<UserData>?.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.