You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:15:44