簡體   English   中英

Swift 擴展最佳實踐

[英]Swift Extensions Best Practices

我最近對Extensions上癮了。 我發現一個巨大的 PITA 的一件事是弄清楚我在哪里藏了一個有用的方法,比如一個Array ,一個NSManagedObject等。

我所做的是將我的擴展放在一個名為CustomExtensionsNSObject類文件中, CustomExtensions字母順序在那里列出類擴展。

它有效,但我想看看它是否符合最佳實踐。 如果沒有,跟蹤Extensions的最佳方法是什么?

這是我所做的:

class CustomExtensions: NSObject {
    /*
     Useful extensions, nothing else here
     */
}
// Example extension    
extension Int {
    func formatAsTimeString() -> String {
        let seconds = self % 60
        let minutes = (self / 60) % 60
        let hours = self / 3600
        let stringHours = hours > 9 ? String(hours) : "0" + String(hours)
        let stringMinutes = minutes > 9 ? String(minutes) : "0" + String(minutes)
        let stringSeconds = seconds > 9 ? String(seconds) : "0" + String(seconds)

        if hours > 0 {
            return "\(stringHours):\(stringMinutes):\(stringSeconds)"
        }
        else {
            return "\(stringMinutes):\(stringSeconds)"
        }
    }
}
// More extensions below

我認為還沒有找到圍繞這個問題的“最佳實踐”。 也就是說,這是 MHO:

最終,我會像在 C 中處理全局函數一樣對待這些擴展。畢竟,它們基本上就是這樣。 具有特殊語法的全局函數...

如果擴展名只在一個文件中使用,那么我會把擴展名放在同一個文件中。 當我完成時,我最終得到了很多這樣的東西。 例如,您的formatAsTimeString是一種視圖模型。 如果它被單個視圖控制器使用,我會將它留在視圖控制器的文件中。

如果擴展名被多個類使用,那么我會將它分解成一個單獨的文件。 我將在擴展名后命名文件。 因此,例如,如果formatAsTimeString用於多個文件,那么我將有一個名為“Int+formatAsTimeString.swift”的文件,擴展名可以在其中使用。

如果有多個相關的函數,那么我會將它們放在同一個文件中,並根據函數的抽象思想命名文件。 我通過想象如果我選擇在不同的程序中使用它們是否必須將它們全部移動在一起來決定這些函數是相關的......例如,也許我有其他與時間字符串相關的函數......

對於 Swift3,如果擴展名僅用於一個文件中,我通常傾向於使用“fileprivate”。

fileprivate extension Date
{
    func toString( dateFormat format  : String ) -> String
    {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        return dateFormatter.string(from: self)
    }
}

我很想在這方面有好的“官方”指導方針! 但正如前面提到的,隨着我們的進展,人們正在弄清楚這一點。

ViewController-擴展

我發現一個有趣的用途是更復雜的類的文件內擴展,比如 ViewController。

而不是去:

public class MainViewController: UIViewController, SpecialDelegate {
  // functions
}

您可以將每個導入擴展到其自己的擴展中:

public class MainViewController: UIViewController {
  // functions
}

extension MainViewController: SpecialDelegate {
  // functions
}

這些有效地用作更容易的格式化,並且可以更容易地組織擴展類,特別是對於非常大的類/項目。 請注意,這些應該保留在同一個文件中,或者至少在主文件旁邊的一個文件中。

簡單的附加功能

對於像這樣的簡單擴展:

extension Int {
  /**
   Returns true when the integer is even.
   */
  var isEven: Bool {
    return self % 2 == 0
  }
}

我通常有一個標有extensions的文件夾,我保存所有擴展文件。 我目睹了更復雜的項目,這些項目的文件與它們的使用位置更接近,但我不同意這種用法。

畢竟,擴展應該在整個項目中使用,隱藏它們會使查找某個擴展是否已經存在變得更加困難。

高度專業化的功能

正如此處的其他回復中所述,為不會在其他地方使用的用例創建文件私有擴展名,並將其放入使用它的文件中是有意義的

fileprivate extension String {
  // Highly specialized function that will NEVER be used anywhere else
}

擴展命名

我注意到寫出擴展文件的各種類型。 當我開始做 iOS-dev 時,流行的指導方針是編寫String-Extension.swift 現在String+Extension.swift似乎贏了。

除此之外,很多人將添加功能的名稱寫入文件,例如Int+IsEven.swift ,但這僅在每個文件只有一個函數時才有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM