无法将“Binding<String?>”类型的值转换为预期的参数类型“Binding<String>”[重复]

Posted

技术标签:

【中文标题】无法将“Binding<String?>”类型的值转换为预期的参数类型“Binding<String>”[重复]【英文标题】:Cannot convert value of type 'Binding<String?>' to expected argument type 'Binding<String>' [duplicate] 【发布时间】:2021-07-27 11:17:20 【问题描述】:

我正在尝试在单独的详细信息视图中编辑项目。从列表中选择项目后,我希望在文本字段中填充项目详细信息。

      List 
                    ForEach(vm.savedEntites)  entity in
                        Text(entity.name ?? "No Name")

                        HStack 
                        Button(action: vm.deleteMemory(entity: entity)) 
                                       Label("Delete",systemImage: "trash")
       
                                     
                     
                            Button(action: 
                                    vm.selectedEntity = entity
                                    showingDetailScreen.toggle()) 
                            Label("Details", systemImage: "pencil")
                                     
                            
                        
                    // list ends here
                    .sheet(isPresented: $showingDetailScreen) 
                        DetailItemView(isVisible: self.$showingDetailScreen, entity: vm.selectedEntity!, text: vm.selectedEntity!)
                           // sheet ends here
                
            

详细项目视图表。这是我在 TextField 旁边收到此错误的地方

无法将 'Binding' 类型的值转换为预期参数 输入“绑定”

 struct DetailItemView: View  
        
        @Environment(\.presentationMode) var presentationMode
        @Binding var isVisible: Bool
        var entity: MemoryEntity
        @ObservedObject var text: MemoryEntity
 
        var body: some View 
           Text(entity.name ?? "No Name")
           TextField(text.name ?? "No Name", text: $text.name)
         ....

这是项目的 CoreData 模型类

class CoreDataViewModel: ObservableObject 
    let container: NSPersistentContainer
    @Published var savedEntites: [MemoryEntity] = []
    @Published var selectedEntity: MemoryEntity?
    init() 
        container = NSPersistentContainer(name: "MemoryContainer")
        container.loadPersistentStores  (description, error) in
            if let error = error 
              print("Error loading CoreData. \(error)")
        
        
        FetchMemories()
    

【问题讨论】:

似乎 $text.name 是可选的 使用这个:TextField(text.name ?? "No Name", text: Binding(get: text.name ?? "", set: text.name = $0)) 【参考方案1】:

由于所有核心数据字段都是可选的,因此您必须将其包装到 Binding 中。由于您使用的是核心数据并且可能会面临很多选项,因此您可以创建一个扩展:

extension Binding 
     func toUnwrapped<T>(defaultValue: T) -> Binding<T> where Value == Optional<T>  
        Binding<T>(get:  self.wrappedValue ?? defaultValue , set:  self.wrappedValue = $0 )
    

像这样使用它:

TextField("title", text: $text.name.toUnwrapped(defaultValue: ""))

【讨论】:

不错的解决方法,但是在许多情况下,您需要将其保留为可选以避免设置值

以上是关于无法将“Binding<String?>”类型的值转换为预期的参数类型“Binding<String>”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有 CurrentValueSubject 绑定的 TextField 上的“Binding<String> 操作尝试每帧更新多次”

如何修复 TextField Binding <String> 以在 SwiftUI 中显示和编辑

SwiftUI ViewModel 发布的属性和绑定

SQL Server Management Studio 无法将类型为“System.__ComObject

为啥我无法正确获取图像数据或无法将数据发送到服务器?

无法将 createdAt 和 updatedAt 保存为日期时间值,也无法将后端保存为前端