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
相关产品推荐
相关产品推荐

