Mikael Wills
Mikael Wills

Reputation: 195

SwiftUI Unknown Attribute 'Observable Object'

So I'm getting the error Unknown attribute ObservableObject next to the @ObservableObject var dataSource = DataSource() call below. the ObservableObject worked perfectly a couple days ago in another project but not anymore.

import SwiftUI
import Combine


class DataSource: ObservableObject {

    var willChange = PassthroughSubject<Void,Never>()


    var expenses = [Expense]() {
        willSet { willChange.send() }
    }
    var savingsItems = [SavingsItem](){
        willSet { willChange.send() }
    }

    //@State var monthlyIncomeText: String
    //var monthlyIncome: Int = 1364


    init(){
        addNewExpense(withName: "Spotify", price: 14)

    }

    func addNewExpense(withName name: String, price: Int){
        let newExpense = Expense(name: name, price: price)
        expenses.append(newExpense)
    }

     func addNewSavingsItem(withName name: String, price: Int, percentage: Double){
        let newSavingsItem = SavingsItem(name: name, price: price, timeTilCompletion: 0, percentage: percentage)
        savingsItems.append(newSavingsItem)
    }
}

struct ContentView: View {

    @ObservableObject var dataSource = DataSource()

    var body: some View {
        VStack{
            Text("Expenses")
            List(dataSource.expenses) { expense in
                ExpenseRow(expense: expense)
            }
        } 
    } 
}

Could anyone help?

Upvotes: 10

Views: 18493

Answers (1)

RPatel99
RPatel99

Reputation: 8106

ObservableObject is a protocol that ObservedObjects must conform to. See here for documentation on ObservableObject, and here for documentation on ObservedObject, which is the property wrapper that you are looking for. Change your ContentView code to this:

struct ContentView: View {

    @ObservedObject var dataSource = DataSource()

    var body: some View {
        VStack {
            Text("Expenses")
            List(dataSource.expenses) { expense in
                ExpenseRow(expense: expense)
            }
        } 
    } 
}

Upvotes: 16

Related Questions