我想将多个类与预算选择器视图一起使用。他们都定义了这个可预算的协议。
import SwiftUI
struct BudgetPickerView: View {
@EnvironmentObject var userData: UserData
@State var budgetable: Budgetable
...
}
import Foundation
protocol Budgetable
{
var budgetId: String { get set }
}
例如,此分配类
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))...
无法将类型为"导航链接>,预算选取器视图>"的返回表达式转换为返回类型"某些视图">
表达式类型"BudgetPickerView"不明确,没有更多上下文
更改为波纹管代码
struct BudgetPickerView: View {
@EnvironmentObject var userData: UserData
var budgetable: Budgetable
var body: some View {
...
}
}
和
NavigationLink(destination: BudgetPickerView(budgetable: allocation).EnvironmentObject(UserData()))
根据 SwiftUI 概念,您不允许在 View 之外使用@State
,但以下内容效果很好(其他部分保持不变(
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") }
}
}
}
顺便说一句,以防万一,同样是设计使@State旨在保存仅临时视图状态的数据,而不是模型。对于模型最好使用ObservableObject
。在你的情况下Budgetable
看起来像一个模型。