Невозможно преобразовать значение типа 'Float' в ожидаемый тип аргумента 'Binding <Float>' Error Swift 5.2 - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь реорганизовать свой код с помощью шаблона MVVM, все идет хорошо, пока я не достиг одного из свойств моего проекта, которое является числом с плавающей точкой, которое публикуется из файла viewModel и наблюдается в файле ContentView, чтобы показать процентную долю от индикатор. Мое понимание по этому вопросу очень примитивно, поэтому мне нужна серьезная помощь. Ниже приведен раздел моего кода из файлов view и viewModel моего проекта, связанных с полученной ошибкой:

//-----------------------ContentView File

import SwiftUI


struct ContentView: View {
    @ObservedObject var quizBrain = QuizBrain()
    var body: some View {
        VStack {
            ProgressBar(barValue: quizBrain.progBarPercentage).frame(height: 35) }  
// Here I get this error: Cannot convert value of type 'Float' to expected argument type 'Binding<Float>'

struct ProgressBar: View {
    @Binding var barValue: Float
    var body: some View {
        GeometryReader { geometry in
            ZStack(alignment: .leading) {
                Rectangle().frame(width: geometry.size.width , height: geometry.size.height)
                    .opacity(0.3)
                    .foregroundColor(Color(UIColor.systemTeal))
                Rectangle().frame(width: min(CGFloat(self.barValue)*geometry.size.width, geometry.size.width), height: geometry.size.height)
                    .foregroundColor(Color(UIColor.systemBlue))
                    .animation(.linear)
            }.cornerRadius(45.0)
        }
    }
}



//--------------------ViewModel File


import Foundation

class QuizBrain: ObservableObject {
@Published var x = 10       //a method generate this Int
@Published var y = 8        //a method generate this Int
@Published var progBarPercentage : Float = 0.0

func progressBarFunc() {
      progBarPercentage = Float(y)/Float(x)
    }
}

Ответы [ 3 ]

3 голосов
/ 08 апреля 2020

Вы должны использовать привязку вашего quizBrain объекта, а не значение Float progBarPercentage.

struct ContentView: View {
    @ObservedObject var quizBrain = QuizBrain()
    var body: some View {
        VStack {
            ProgressBar(barValue: $quizBrain.progBarPercentage).frame(height: 35)
            // Add $ to create a two way binding
        }
    }
}
2 голосов
/ 08 апреля 2020

Чтобы получить доступ к привязке из значения @Published, вы должны использовать projectedValue через '$', как показано ниже

var body: some View {
    VStack {
        ProgressBar(barValue: $quizBrain.progBarPercentage).frame(height: 35) }  
1 голос
/ 08 апреля 2020

Бези, в этом случае аргумент должен быть привязкой типа Binding<Float>, вам не хватает "$".

...