从其他类

时间:2018-04-12 20:41:13

标签: ios swift struct

我有以下类结构:

class JsonHelper {

    //for tests only
    struct arrivalScan {
        let TOID: String
        let UserId: String
        let GateId: String
        let TimeStamp: String
    }


    func sendArrival(scan: arrivalScan){
      //do something
    }

}

在我的视图控制器中,我正在尝试创建初始化arrivalScan:

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

然后将其作为参数传递给sendArrival

中的JsonHelper函数
JsonHelper.sendArrival(scan)

但是得到错误' JsonHelper.arrivalScan'不能转换为' JsonHelper'

我做错了什么?

5 个答案:

答案 0 :(得分:3)

有一些问题:

  1. 首先,始终使用首字母大写字母命名您的类和结构。 arrivalScan应为ArrivalScan。这将有助于您区分类(或结构)和实例。

  2. sendArrival函数是一个实例函数。您正在尝试访问它,就好像它是一个类函数。创建JsonHelper类的实例,然后在该实例上调用该函数。

  3. 结构中的变量名称应以小写开头。

  4. 示例:

    class JsonHelper {
    
        struct ArrivalScan {
            let toId: String
            let userId: String
            let gateId: String
            let timestamp: String
        }
    
        func sendArrival(scan: ArrivalScan) {
            //do something
        }
    
    }
    
    let helper = JsonHelper()
    let scan = JsonHelper.ArrivalScan(toId: "value", userId: "value", gateId: "value", timestamp: "value")
    
    helper.sendArrival(scan: scan)
    

答案 1 :(得分:1)

你应该像下面这样调用这个方法,

JsonHelper().sendArrival(scan: scan)

由于sendArrival不是static/class方法,因此应该通过调用初始化程序来访问它,并且您还缺少参数名称scane:

答案 2 :(得分:1)

问题是你试图直接从类本身调用sendArrival而不从中创建实例。所以你有两个选择来解决这个问题:

1 - static func sendArrival(scan: arrivalScan){ //do something } emthod声明为 static

JsonHelper.sendArrival(scan: scan)

因此:

JsonHelper

2 - let scan = JsonHelper.arrivalScan.init(TOID:"D/0098/123456",UserId:"O0124553",GateId: "G/0098/536371",TimeStamp: "11/04/2018 11:51:00") let jsonHelperObject = JsonHelper() jsonHelperObject.sendArrival(scan: scan) 创建实例并使用它调用方法:

JsonHelper

选择其中一个解决方案取决于ArrivalScan类的适当设计。

除了条形码:

  • 作为命名约定,命名结构应遵循上面的驼峰大小写,这意味着arrivalScan而不是sendArrival

  • 调用sendArrival(scan: scan)方法时,您必须提及标签:sendArrival(scan) // compile-time error而不是func sendArrival(_ scan: arrivalScan)。如果您想在不提及标签的情况下调用它,可以将其声明为sendArrival(scan),因此您可以将其称为scan

  • 您可以将let scan = JsonHelper.arrivalScan(TOID:"D/0098/123456",UserId:"O0124553",GateId: "G/0098/536371",TimeStamp: "11/04/2018 11:51:00")实例化为.init(...,而无需{{1}}。

答案 3 :(得分:0)

您需要创建JsonHelper类的实例才能调用sendArrival()方法,从而解决错误:

let jsonHelper = JsonHelper()
jsonHelper.sendArrival(scan)

答案 4 :(得分:0)

或将sendArrival标记为静态。