【问题标题】:SwiftUI Xcode 11 beta 5 / 6: Type of expression is ambiguous without more contextSwiftUI Xcode 11 beta 5 / 6:表达式类型不明确,没有更多上下文
【发布时间】:2019-08-20 17:37:22
【问题描述】:

从 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
 }
}

【问题讨论】:

  • 这是否有可能在 ForEach 中,它将 Binding 作为闭包迭代类型?

标签: xcode swiftui


【解决方案1】:

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

  • 使用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
 }
}

【讨论】:

  • 是的,我知道,我为护照详细信息类添加了一些代码。也许有什么问题?
  • 另请注意,您可以使用 @Published 来避免调用 objectWillChange.send()
  • 感谢修复!不幸的是,它仍然产生相同的错误。我添加了另一个字符串属性mrz,其中我有几个相同类型的(didSet ...)。也许有错误?
  • 嗯....我发布的代码编译得很好。如果您更新答案,我会很高兴再看看。还要注意 send() 应该从 willSet 调用,而不是 didSet。虽然你可以一起避免这一切,但如果你声明你的财产@Published。
  • 我根据您的建议更新了我的帖子。另外,我创建了 mrz 属性 @Published。
猜你喜欢
  • 2020-03-05
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多