SwiftUI Xcode 11 beta 5 / 6:表达式类型在没有更多上下文的情况下不明确

SwiftUI Xcode 11 beta 5 / 6: Type of expression is ambiguous without more context

从 beta 5 开始,我的项目将不再编译。该按钮的文本的错误是 "Type of expression is ambiguous without more context"。 我认为它可能会在 beta 6 中修复,但事实并非如此。 macOS 也更新到 Catalina beta 7.

 class ClPassport : ObservableObject , Identifiable {


    @Published var mrz : String =  "" //{ didSet { update() } } 
    var isValid : Bool {
        return true
    }

    func update() {
        objectWillChange.send(())
    }

    func getMRZKey() -> String {
     return ""
    }
}


struct ContentView : View {

    @ObservedObject var passportDetails = ClPassport()
      var body: some View {

         ZStack{
           VStack(alignment: .leading){
             HStack{
                  Spacer()
                  Button(action: {
                      self.scanPassport( mrzKey: self.passportDetails.getMRZKey() )
                    }) {
                        Text("Read Chip") // <-  "Type of expression is ambiguous without more context"
                            .font(.largeTitle)
                        .foregroundColor(passportDetails.isValid ? .primary : Color.secondary.opacity(0.25))
                            .padding()
                        }.padding()
                        .background(Color.white.opacity(passportDetails.isValid ? 1 : 0.5))
                        .cornerRadius(15)
                        .padding()
                        .disabled( !passportDetails.isValid )
                   Spacer()
              }
            TextField($passportDetails.mrz, placeholder: Text("MRZ"))
            }
          }
        }

 func scanPassport( mrzKey: String ) {
   //do stuff with mrzKey
 }
}

更新您的答案后,我发现需要进行一些更改:

  • 使用ObservableObject(不需要使用Combine.ObservableObject
  • 缺少功能scanPassport,我添加了一个假的。
  • willChange不存在了,现在是objectWillChange。它是自动合成的。
import SwiftUI

class ClPassport : ObservableObject , Identifiable {


    @Published var mrz : String =  "" //{ didSet { update() } }
    var isValid : Bool {
        return true
    }

    func update() {
        objectWillChange.send()
    }

    func getMRZKey() -> String {
     return ""
    }
}


struct ContentView : View {

    @ObservedObject var passportDetails = ClPassport()
      var body: some View {

         ZStack{
           VStack(alignment: .leading){
             HStack{
                  Spacer()
                  Button(action: {
                      self.scanPassport( mrzKey: self.passportDetails.getMRZKey() )
                    }) {
                        Text("Read Chip")
                            .font(.largeTitle)
                        .foregroundColor(passportDetails.isValid ? .primary : Color.secondary.opacity(0.25))
                            .padding()
                        }.padding()
                        .background(Color.white.opacity(passportDetails.isValid ? 1 : 0.5))
                        .cornerRadius(15)
                        .padding()
                        .disabled( !passportDetails.isValid )
                   Spacer()
              }
            TextField("MRZ", text: $passportDetails.mrz)
            }
          }
        }

 func scanPassport( mrzKey: String ) {
   //do stuff with mrzKey
 }
}