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

Swift:如何从视图控制器访问其他类的结构体并调用方法?

解决Swift中嵌套结构体的外部访问及方法调用问题

你的问题核心在于嵌套结构体的访问权限和实例方法的调用方式,下面一步步给你解决:

1. 调整嵌套结构体的访问权限

Swift中,类内部定义的嵌套类型(比如你的arrivalScan结构体)默认访问级别是fileprivate——也就是说只有同一个文件里的代码能访问它。如果你的视图控制器在另一个文件,自然就没法初始化这个结构体了。

所以第一步要给arrivalScan显式设置访问级别:如果你的代码都在同一个模块(比如同一个App项目)里,用internal就够(其实可以省略,显式声明后模块内所有代码都能访问);如果需要跨模块调用(比如框架给主App用),就用public。

修改后的JsonHelper类:

class JsonHelper { 
    // 显式声明结构体的访问级别,让外部能访问
    struct arrivalScan { 
        let TOID: String 
        let UserId: String 
        let GateId: String 
        let TimeStamp: String 
    }

    func sendArrival(scan: arrivalScan){ 
        // 这里写你的执行逻辑
        print("已接收扫描数据:TOID=\(scan.TOID),用户ID=\(scan.UserId)")
    }
}

2. 正确调用实例方法

注意你的sendArrival是实例方法(没有static/class修饰),所以不能直接用JsonHelper.sendArrival调用,必须先创建JsonHelper的实例对象,再调用方法。

在视图控制器中的完整调用代码:

// 1. 初始化arrivalScan实例
let scan = JsonHelper.arrivalScan(
    TOID:"D/0098/123456",
    UserId:"O0124553",
    GateId: "G/0098/536371",
    TimeStamp: "11/04/2018 11:51:00"
)

// 2. 创建JsonHelper的实例
let jsonHelper = JsonHelper()

// 3. 调用sendArrival方法
jsonHelper.sendArrival(scan: scan)

可选:改为类方法(无需创建实例)

如果你的sendArrival不需要依赖JsonHelper的实例属性,可以把它改成类方法,这样就不用创建实例了:

修改JsonHelper的方法:

class JsonHelper { 
    struct arrivalScan { 
        let TOID: String 
        let UserId: String 
        let GateId: String 
        let TimeStamp: String 
    }

    // 添加static修饰,变成类方法
    static func sendArrival(scan: arrivalScan){ 
        // 执行操作
        print("已接收扫描数据:TOID=\(scan.TOID)")
    }
}

对应的调用代码简化为:

let scan = JsonHelper.arrivalScan(
    TOID:"D/0098/123456",
    UserId:"O0124553",
    GateId: "G/0098/536371",
    TimeStamp: "11/04/2018 11:51:00"
)

// 直接通过类名调用
JsonHelper.sendArrival(scan: scan)

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:10:36