Swiftui - 显示要查看的解码数据时出错

Swiftui - Error displaying decoded data to view

我无法通过传递到我的视图的环境对象将我解码为结构的数据显示到我的视图。显示的错误消息是“在对初始化程序的调用中没有完全匹配”。我一直想弄明白,但运气不好。

这是我的网络文件的一些代码,用作解码结构的真实来源

class AuthViewModel: ObservableObject {
    
    @Published var user: LoginResponseData.Root? = nil
    @Published var alert: CustomAlert? = nil
    @Published var claimHistroy: ClaimStruct? = nil
    
    var authentication: AuthenticationCheck? = nil
    
    var showLoader = false
    
    let networkService: NetworkService = NetworkService.shared
    
    func signIn(username: String, password: String) {
        networkService.signIn(username: username, password: password) { (result) in
            switch result {
            case .success(let user):
                print("This user last name is: \(user.result.login.userName.name.fullName)")
                self.user = user
                 
                self.authentication?.updateValidation(success: true)
                
                // Calls method
                self.profileSessionMember()
                
            case .failure(let error):
                print("The error is: \(error.localizedDescription)")
                //Reset the variable
                self.user = nil
                self.authentication?.updateValidation(success: false)
                // Pass a message to the user 
                self.alert = CustomAlert(title: "Invalid Credentials", message: "Either username or password is incorrect. Please try again")
                
            }
        }
    }
    
    /// Gets the Search Savings Amouny from decoded struct
    func profileSessionMember() {
        networkService.profileSessionMember { result in
            switch result {
            case .success(let userHistory):
                // Sets the claimHistory
                self.claimHistroy = userHistory
                
            case .failure(let error):
                print(error)
            
            }
        }
    }

class AuthenticationCheck: ObservableObject {
    @Published var isValidated = false
    
    func updateValidation(success: Bool) {
        withAnimation {
            isValidated = success
        }
    }
}

这是我的身份验证,其中 environmentObject 被传递到我的视图

@main
struct SomeApp: App {
    @StateObject var authentication = AuthenticationCheck()
    @StateObject var vm: AuthViewModel = AuthViewModel()
    
    var body: some Scene {
        WindowGroup {
            if authentication.isValidated {
                ContentView()
                    .environmentObject(vm)
            } else {
                Signin()
                    .environmentObject(vm)
                    .environmentObject(authentication)

            }
            //TestView()
        }
    }
}

这是我试图显示信息的地方

struct SearchHistory: View {
    @EnvironmentObject var vm: AuthViewModel
    
    var body: some View {
        VStack {
            Text("BASED ON YOUR SEARCH HISTORY")
                .font(.title3)
                .fontWeight(.heavy)
                .foregroundColor(Color(red: 0.584, green: 0.655, blue: 0.992, opacity: 100.0))
                .multilineTextAlignment(.center)
                .padding()
            
            HStack {
                Image(systemName: "dollarsign.circle")
                    .resizable()
                    .frame(width: 43.0, height: 44.0)
                    .aspectRatio(contentMode: .fill)
                    .padding()
                
                VStack{
                    Text("Total")
                        .multilineTextAlignment(.center)
                    Text("Amount")
                        .multilineTextAlignment(.center)
                    // This does not work
                    Text(vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount)
                }
            }
        }
    }
}

Text() 需要有一些字符串才能工作。由于“vm.claimHistroy”可能为零,如果它变为零,请尝试在其中包含一些文本。像这样:

 Text(vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount ?? "")

你甚至可以试试这个:

 if let history = vm.claimHistroy {
     Text(history.result.member.yearToDateSearchSavingsAmount)
 }

编辑:

如果“yearToDateSearchSavingsAmount”不是字符串,试试这个:

if let amount = vm.claimHistroy?.result.member.yearToDateSearchSavingsAmount {
    Text("\(amount)")
}