gpt4 book ai didi

Swift - 如何从 View 之外的 func 访问 @Published var?

转载 作者:行者123 更新时间:2023-11-30 10:29:05 29 4
gpt4 key购买 nike

我试图从 View 中删除逻辑,同时保留 SwiftUI 的优点。想法 1 可行,但它使用了一个比我想要的额外的变量。想法 2 给出错误:本地属性尚不支持属性包装器。该 View 应返回“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)
}
}

最佳答案

如果您希望函数能够访问 View 的状态,请传递状态:

func logic(state: State) {
state.data2 = Model.bar.rawValue
print(state.data2)
}

但是你在这里所做的是一个无限循环。修改 View 的状态会导致 View 重新渲染。因此,每次渲染 View 时,它都会修改其状态并强制再次渲染。这永远不会解决。您在这里的意思可能是在 View 首次出现时更改状态,在这种情况下,您可以这样调用logic:

struct Bar: View {

@EnvironmentObject private var state: State

internal var body: some View {
Text(verbatim: state.data2)
.onAppear{ logic(state: self.state) }
}
}

关于Swift - 如何从 View 之外的 func 访问 @Published var?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59511750/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com