我试图从视图中删除逻辑,同时保留SwiftUI的优点。想法1可行,但它使用了我想要的额外变量。想法2给出错误:本地属性尚不支持属性包装器。该视图应返回“ bar”。使这项工作最好的方法是什么?非常感谢。
import Combine
import Foundation
import SwiftUI
// Model
enum Model: String, RawRepresentable {
case foo = "foo"
case bar = "bar"
}
// State
var data1: String = Model.foo.rawValue
class State: ObservableObject {
@Published internal var data2: String = data1
}
// Logic
func logic() {
// Idea 1: OK
//data1 = Model.bar.rawValue
//print(State().data2)
// Idea 2: Error Property wrappers are not yet supported on local properties
@EnvironmentObject private var state: State
state.data2 = Model.bar.rawValue
print(state.data2)
}
// View
struct bar: View {
@EnvironmentObject private var state: State
internal var body: some View {
logic()
return Text(verbatim: self.state.data2)
}
}
答案 0 :(得分:0)
如果您希望函数可以访问视图的状态,请传递状态:
func logic(state: State) {
state.data2 = Model.bar.rawValue
print(state.data2)
}
但是您在这里所做的是一个无限循环。修改视图的状态会导致视图重新呈现。因此,每次渲染视图时,它都会修改其状态并强制其再次渲染。那将永远无法解决。您可能的意思是更改视图首次出现时的状态,在这种情况下,您可以通过以下方式调用logic
:
struct Bar: View {
@EnvironmentObject private var state: State
internal var body: some View {
Text(verbatim: state.data2)
.onAppear{ logic(state: self.state) }
}
}