【问题标题】:Access struct from other class从其他类访问结构
【发布时间】:2018-04-12 20:41:12
【问题描述】:

我有以下带有结构的类:

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
    }

}

在我的视图控制器中,我正在尝试创建初始化到达扫描:

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

然后将此作为参数传递给JsonHelper 中的sendArrival 函数

JsonHelper.sendArrival(scan)

但出现错误“JsonHelper.arrivalScan”不能转换为“JsonHelper”

我做错了什么?

【问题讨论】:

  • 你应该避免直接使用initJsonHelper.arrivalScan(TOID:... 就足够了。
  • 为什么要避免直接使用 init 的任何具体原因? @瑞安
  • @BadhanGanesh 因为你不需要。您不想每次都输入更多字符,是吗?如果您使用的是类似 swiftlint 的脚本工具,那么在一行中保存字符可能是个大问题。

标签: ios swift struct


【解决方案1】:

有几个问题:

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

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

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

例子:

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)

【讨论】:

    【解决方案2】:

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

    JsonHelper().sendArrival(scan: scan)
    

    因为sendArrival 不是static/class 方法,所以应该通过调用初始化程序来访问它,而且您缺少参数名称scane:

    【讨论】:

      【解决方案3】:

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

      1-sendArrival emthod 声明为静态

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

      因此:

      JsonHelper.sendArrival(scan: scan)
      

      2-JsonHelper 创建一个实例并使用它调用方法:

      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(...

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          或将sendArrival 函数标记为静态。

          【讨论】:

            猜你喜欢
            • 2019-03-03
            • 1970-01-01
            • 2018-09-09
            • 1970-01-01
            • 1970-01-01
            • 2013-07-04
            • 2016-10-25
            • 2014-10-06
            • 1970-01-01
            相关资源
            最近更新 更多