SwiftUI中在另一个类使用Observable Object报错求助
问题:在另一个类中调用ObservableObject的数组进行验证时出错
想要在另一个类中使用ObservableObject,具体是调用PositionViewModel类里的Pitchers数组,将其传入ValidationLogic类的不同函数中进行规则验证。
PositionViewModel代码如下:
import Foundation import SwiftUI class PositionViewModel: ObservableObject, Identifiable { @Published var Pitchers: [String] = ["--","--","--","--","--","--"] }
编写的ValidationLogic类代码如下:
class ValidationLogic: ObservableObject { @Published var Positions: PositionViewModel = PositionViewModel() var TempArray: [String];.self//error here init(){ TempArray = Positions.Pitchers } static func Validation(Position: String, FrameStatus: Bool){ confirmNoBackToBack(Position: Position, FrameStatus: FrameStatus) } static func confirmNoBackToBack(Position: String, FrameStatus: Bool){ } }
目前在标注错误的行上出现了“Expected Declaration”错误,不确定是只需修复该错误即可,还是整体实现思路有误。能在视图中正常使用Pitchers,但无法在ValidationLogic类中正常调用它,希望得到解决方法。
解决方案
1. 修复直接的语法错误
错误行的语法完全错误,.self属于多余写法,且Swift声明变量不需要加分号,直接修改为:
var TempArray: [String]
2. 调整实现思路解决逻辑问题
修复语法错误后,还会遇到静态方法无法访问实例属性的问题(静态方法属于类本身,无法调用实例级别的TempArray或Positions),针对你的需求,有两种优化方向:
方向一:改用实例方法,去掉static修饰符
让方法属于ValidationLogic的实例,这样就能直接访问类内的Positions.Pitchers或TempArray:
class ValidationLogic: ObservableObject { @Published var positions: PositionViewModel = PositionViewModel() // 遵循Swift小驼峰命名规范 var tempArray: [String] init(){ tempArray = positions.Pitchers } func validate(position: String, frameStatus: Bool){ // 方法名、参数名统一小驼峰 confirmNoBackToBack(position: position, frameStatus: frameStatus) } func confirmNoBackToBack(position: String, frameStatus: Bool){ // 直接使用tempArray或positions.Pitchers编写验证逻辑 print("验证数组:\(tempArray),当前位置:\(position)") } }
使用示例:
let validator = ValidationLogic() validator.validate(position: "投手", frameStatus: true)
方向二:静态方法接收数组参数
如果希望保持方法为静态,可将Pitchers数组作为参数传入,无需在ValidationLogic中持有PositionViewModel实例:
class ValidationLogic { // 若无需响应式更新视图,可去掉ObservableObject协议 static func validate(position: String, frameStatus: Bool, pitchers: [String]){ confirmNoBackToBack(position: position, frameStatus: frameStatus, pitchers: pitchers) } static func confirmNoBackToBack(position: String, frameStatus: Bool, pitchers: [String]){ // 使用传入的pitchers数组执行验证逻辑 print("验证数组:\(pitchers),当前位置:\(position)") } }
使用示例:
let vm = PositionViewModel() ValidationLogic.validate(position: "投手", frameStatus: true, pitchers: vm.Pitchers)
额外建议
- 遵循Swift命名规范:变量名、方法名用小驼峰(如
pitchers而非Pitchers),类名用大驼峰,提升代码可读性。 - 若
ValidationLogic不需要响应式更新视图,可移除ObservableObject协议,减少不必要的发布者开销。
内容的提问来源于stack exchange,提问作者Warkoi
相关产品推荐
相关产品推荐

