使用协议定义swiftui视图的属性

使用协议定义swiftui视图的属性,swiftui,Swiftui,我有多个类要与预算选取器视图一起使用。他们都定义了这个可预算协议 import SwiftUI struct BudgetPickerView: View { @EnvironmentObject var userData: UserData @State var budgetable: Budgetable ... } 例如,这个分配类 import Foundation import Combine class Allocation: ObservableObj

我有多个类要与预算选取器视图一起使用。他们都定义了这个可预算协议

import SwiftUI

struct BudgetPickerView: View {
    @EnvironmentObject var userData: UserData
    @State var budgetable: Budgetable
    ...
}
例如,这个分配类

import Foundation
import Combine

class Allocation: ObservableObject, Identifiable, Budgetable {
    let objectWillChange = ObservableObjectPublisher()

    let id: String?
    var amount: String { willSet { self.objectWillChange.send() } }
    var budgetId: String { willSet { self.objectWillChange.send() } }

    init(id: String? = nil, amount: String, budgetId: String) {
        self.id = id
        self.amount = amount.removePrefix("-")
        self.budgetId = budgetId
    }
}
然而,当我试图将分配传递到我的预算选择器视图时,我得到了一个错误

NavigationLink(destination: BudgetPickerView(budgetable: allocation))...
无法将“NavigationLink>,BudgetPickerView>”类型的返回表达式转换为返回类型“some View”

表达式类型“BudgetPickerView”不明确,没有更多上下文

更改为以下代码

struct BudgetPickerView: View {
   @EnvironmentObject var userData: UserData
   var budgetable: Budgetable
   var body: some View {
   ...
   }
}


根据SwiftUI的概念,您不允许在视图外使用
@State
,但以下操作效果良好(其他部件保持不变)

struct BudgetPickerView:View{
@国家私有var预算表:预算表
初始(预算表:预算表){
_budgetable=状态(初始值:budgetable)
}
var body:一些观点{
文本(“你好,世界!”)
}
}
结构TestBudgetPickerView:视图{
var body:一些观点{
导航视图{
导航链接(目的地:
BudgetPickerView(预算表:分配(金额:“10”,预算TID:“1”))
{文本(“项目”)}
}
}
}

顺便说一句,以防万一,@State再次被设计成只保存临时视图状态数据,而不是模型。对于模型,最好使用
可观察对象
。在您的情况下,
BudgetTable
看起来像一个模型。

首先需要传递像NavigationLink这样的环境对象(目标:BudgetPickerView(BudgetTable:allocation)。已在场景委托上设置的环境对象(UserData()),当我添加以下内容时,它也不会删除错误:无论您在何处调用BudgetPickerView,都必须传递EnvironmentObject,即使我这样做,同样的错误仍然存在,并且为什么您作为param BudgetPickerView(BudgetTable:allocation)传递,您的BudgetTable似乎是BudgetPickerView中的状态?这不起作用,你必须用
.environmentObject
添加环境对象,否则你会得到一个不同的错误,但通过修复,我会得到与我在问题中发布的相同的错误。对,但你不能将ObserveObject与协议一起使用
struct BudgetPickerView: View {
   @EnvironmentObject var userData: UserData
   var budgetable: Budgetable
   var body: some View {
   ...
   }
}
NavigationLink(destination: BudgetPickerView(budgetable: allocation).EnvironmentObject(UserData()))
struct BudgetPickerView: View {
    @State private var budgetable: Budgetable

    init(budgetable: Budgetable) {
        _budgetable = State<Budgetable>(initialValue: budgetable)
    }

    var body: some View {
        Text("Hello, World!")
    }
}
struct TestBudgetPickerView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: 
               BudgetPickerView(budgetable: Allocation(amount: "10", budgetId: "1"))) 
               { Text("Item") }
        }
    }
}