2017-08-25 82 views
-1

我試圖重構struct的init方法。 Init接收字典並從中初始化結構。有幾個長的解析邏輯部分(遍歷數組等)和init太長。我試圖提取這種邏輯功能分開,但是編譯器告訴我(榮譽新的Xcode的重構功能!):從結構初始化提取函數

self使用的所有存儲屬性初始化之前

有什麼辦法來重構我的凌亂初始? 我想到了創建單獨的Parser類的想法,但模型的res(真的很大的項目)解析了每個結構中的JSON init。因此,創建這個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 
    } 
} 
+1

您的代碼沒有意義,且您的結果無法複製。你說你在所有存儲的屬性初始化之前得到「自我使用」,但我沒有;我們從來沒有達到那個地步,因爲'dictionary [「intParam」] ?? 0'不編譯。 – matt

+3

你可以使功能靜態 – dan

+0

此外,這個問題本身似乎沒有任何意義。你不能有一個'[String:Int]'的字典,它也是'[String:Date]'的字典。我沒有看到你認爲你要這樣做的地方。 – matt

回答

4

試着做parseDates靜態函數。

// 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 
    } 
1

你想要做什麼,似乎非常奇怪,但是這將讓你的「理想的實現」:

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 
    func parseDates(_ dictionary: [String: Any]) -> [Date] { 
     var dates: [Date] = [] 
     // long parsing here 
     return dates 
    } 
    self.dates = parseDates(dictionary) 
} 
+0

你能告訴我爲什麼你認爲這是一個奇怪的解決方案?這是一個示例代碼。真正的初始化大小現在是100多行,所以我試圖讓它更易讀... – OgreSwamp

+0

我不明白爲什麼它會變得更具可讀性,只是因爲代碼被分解爲一種方法。如果這是一次性代碼,那麼它就沒有可讀性,因爲它是誤導性的。這就是爲什麼我建議使用本地功能。現在_that_更具可讀性! – matt

+0

謝謝。在你的第一個代碼中,所有的屬性賦值都是緊湊的,並且遵循對方。它很容易閱讀。在第二個代碼中,您將在每個屬性分配之間分配代碼塊。我看不出第二個建議的解決方案如何使它更具可讀性,只有普通的100多行代碼沒有本地功能。我不認爲函數只能在代碼被重用的情況下使用。我認爲代碼分離到邏輯和平也是正確的功能用法。爲了減少第一個解決方案的誤導,你可以添加'fileprivate',這樣就很明顯這個靜態方法從來不會在這個文件之外調用。 – OgreSwamp