我试图重构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
}
}
答案 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
}