从struct init

时间:2017-08-25 18:58:18

标签: swift struct initialization

我试图重构struct的init方法。 Init接收字典并从中初始化struct。有几个很长的解析逻辑部分(迭代数组等),init太长了。我试图提取这个逻辑来分离函数(荣誉到新的Xcode重构功能!)但编译器告诉我:

  在初始化所有存储的属性之前使用

self

有没有办法重构我凌乱的初始化? 我想到了创建单独的Parser类,但模型的res(非常大的项目)在每个结构init中解析JSON。因此,创建此Parser类将使项目不一致......

示例代码:

struct Example {
    let intParam: Int
    let dates: [Date]

    // Current implementation
    init(dictionary: [String: Any]) {
        self.intParam = dictionary["intParam"] as? Int ?? 0
        var dates: [Date] = []
        // long parsing here
        self.dates = dates
    }

    // Desired implementation
    init(dictionary: [String: Any]) {
        self.intParam = dictionary["intParam"] as? Int ?? 0
        self.dates = parseDates(dictionary)
    }

    private func parseDates(_ dictionary: [String: Any]) -> [Date] {
        var dates: [Date] = []
        // long parsing here
        return dates
    }
}

2 个答案:

答案 0 :(得分:4)

尝试将position: absolute; 设为静态函数。

parseDates

答案 1 :(得分:1)

你想要做的事情似乎很奇怪,但这会让你得到“期望的实现”:

  // Desired implementation
  init(dictionary: [String: Any]) {
    self.intParam = dictionary["intParam"] as? Int ?? 0
    self.dates = Example.parseDates(dictionary)
  }

  private static func parseDates(_ dictionary: [String: Any]) -> [Date] {
    var dates: [Date] = []
      // long parsing here
     return dates
   }

但是,我不认为你认为这会让你感到满意。如果在其他地方不需要这种解析操作,并且你只是想让它看起来更整洁,为什么不使用本地函数呢?

init(dictionary: [String: Any]) {
    self.intParam = dictionary["intParam"] as? Int ?? 0
    self.dates = Example.parseDates(dictionary)
}

private static func parseDates(_ dictionary: [String: Any]) -> [Date] {
    var dates: [Date] = []
    // long parsing here
    return dates
}