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



我想将多个类与预算选择器视图一起使用。他们都定义了这个可预算的协议。

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看起来像一个模型。

最新更新