SwiftUI:表达式类型不明确,没有更多上下文,在视图之间传递 ObservableObject 时 [重复]

Posted

技术标签:

【中文标题】SwiftUI:表达式类型不明确,没有更多上下文,在视图之间传递 ObservableObject 时 [重复]【英文标题】:SwiftUI: Type of expression is ambiguous without more context, When passing ObservableObject between Views [duplicate] 【发布时间】:2019-08-23 19:38:33 【问题描述】:

我在 SwiftUI 中寻找 DataStore 的示例并找到了这个示例。

import SwiftUI
import Combine

class MyDatabase: ObservableObject 
    let didChange = PassthroughSubject<MyDatabase, Never>()

    var contacts: [Contact] = [
        Contact(id: 1, name: "Anna"), Contact(id: 2, name: "Beto"),
        Contact(id: 3, name: "Jack"), Contact(id: 4, name: "Sam")
    ] 
        didSet 
            didChange.send(self)
        
    

    struct Contact: Identifiable
        var id: Int
        var name: String
    


struct ContactsList: View 
    @EnvironmentObject private var database: MyDatabase

    var body: some View 
        NavigationView 
            List($database.contacts)  contact in
                NavigationLink(destination: ContactDetail(contact: contact)) 
                    Text(verbatim: contact.value.name)
                    //here Error 1: Types of expression....
                
            
            .navigationBarTitle(Text("Contacts"))
        
    


struct ContactDetail: View 
    @Binding var contact: MyDatabase.Contact

    var body: some View 
        VStack 
            TextField($contact[\.name])
                .textFieldStyle(.roundedBorder)
                .font(.title)
                .padding()
            //here Error 2: Types of expression....
            Spacer()
        
        .navigationBarTitle(Text("Edit"), displayMode: .inline)
    


但是,经过测试,我多次收到以下错误:

没有更多上下文的表达类型是模棱两可的

我还尝试了以下教程以获得相同的解决方案https://mecid.github.io/2019/07/03/managing-data-flow-in-swiftui/ 但我得到了同样的错误。 最新测试版中的绑定有什么变化吗? 我正在运行 Beta 6

【问题讨论】:

我看到了一些警告信号,大部分来自 beta 4 或 5。背景:这些测试版中的某些警告现已变成错误。 (我认为这不是你的问题。)但是...@Published 在哪里?为什么使用@Binding@ObservableObject 称为MyDatabase,并且绑定到MyDatabase.Contact?在 beta 6 中,ObservableObject 没有主要发生任何变化,但在早期的 beta 中确实发生了变化。这段代码有用吗? 【参考方案1】:

您似乎在使用ObservableObject,就像BindableObjectBindableObject 已从 beta 4 (?) 替换。

BindableObject 被 ObservableObject 协议从 结合框架。

didChange 改为 objectWillChange,他应该在 willChange 观察者内部被调用。

为避免重复,@Published 属性为您合成了willChange

您可以通过定义在对象更改之前发出的 objectWillChange 发布者来手动符合 ObservableObject。但是,默认情况下,ObservableObject 会自动合成 objectWillChange 并在任何 @Published 属性更改之前发出。

class User: ObservableObject 

    @Published var name: String = ""
    @Published var email: String = ""


如果您想绑定ObservableObject,请使用@ObservedObject

struct MyView: View 

    @ObservedObject var user: User = User()

    var body: some View 
        TextField("Name", text: $user.name)
    


如果您因为使用@EnvironmentObject而继续遇到问题,请尝试查看:Change to @Published var in @EnvironmentObject not reflected immediately

【讨论】:

以上是关于SwiftUI:表达式类型不明确,没有更多上下文,在视图之间传递 ObservableObject 时 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:表达式类型不明确,没有更多上下文,在视图之间传递 ObservableObject 时 [重复]

Swift 错误:表达式类型不明确,没有更多上下文

放入函数时,工作 Swift 代码返回“表达式类型不明确,没有更多上下文”

Xcode:表达式类型不明确,没有更多上下文

表达式类型不明确,没有更多上下文”Alamofire 错误

表达式类型不明确,在实现解析注册时没有更多上下文错误