1. 程式人生 > IOS開發 >【譯】如何運用 Swift 的屬性包裝器實現應用本地化

【譯】如何運用 Swift 的屬性包裝器實現應用本地化

如何運用 Swift 的屬性包裝器實現應用本地化

您好,Swift 開發者,在本文中,我想與您分享我的經驗和知識,主要內容有屬性包裝器Property Wrapper)的使用,以及如何簡化程式碼並使其易於維護。我會通過幾個主題對此進行說明。

在 Swift 5.1 中,Apple 引入了屬性包裝器,它可以讓我們在屬性和訪問邏輯(getter 和 setter)之間設定中間層。

下面的內容是在 @IBOutlet 變數內部使用屬性包裝器的簡便方法來實現應用本地化。


優化下面這個基礎版本:

class NatureViewController: UIViewController {
  @IBOutlet private var label: UILabel! {
    didSet {
      label.title = NSLocalizedString("natureTitle",comment: "")
    }
  }
  
  @IBOutlet private var button: UIButton! {
    didSet {
      button.setTitle(NSLocalizedString
("saveNatureButton",comment: ""),for: .normal) } } } 複製程式碼

我們可以用屬性包裝器 @Localized 改程序式碼,如下:

class NatureViewController: UIViewController {
  @Localized("natureTitle")
  @IBOutlet private var label: UILabel!
  
  @Localized("saveNatureButton")
  @IBOutlet private var button: UIButton!
}
複製程式碼

這程式碼看起來很優雅,不是嗎?下面讓我們建立 @Localized

屬性包裝器。 將 key 當做列舉來使用會更好,如:@Localized(.natureTitle)

@propertyWrapper
struct Localized<T: Localizable> {
  private let key: LocalizationKey
  
  var wrappedValue: T? = nil {
    didSet {
      wrappedValue?.set(localization: key)
    }
  }
  
  init(_ key: LocalizationKey) {
    self.key = key
  }
}
複製程式碼

為了能讓更多的型別能夠支援 Localizable 協議, 我們要實現 UILabelUIButton 的擴充套件方法。

protocol Localizable {
  func set(localization: LocalizationKey)
}

extension UIButton: Localizable {
  func set(localization key: LocalizationKey) {
    setTitle(key.string,for: .normal)
  }
}

extension UILabel: Localizable {
  func set(localization key: LocalizationKey) {
    text = key.string
  }
}
複製程式碼

最後我們只需要實現 LocalizationKey:

enum LocalizationKey: String {
  case 
  natureTitle,saveNatureButton
}

extension LocalizationKey {
  var string: String {
    NSLocalizedString(rawValue,comment: rawValue)
  }
}
複製程式碼

我們可以直接用 raw 的值來表示相應的 key,String 型別預設遵守這個協議,所以只需要列舉中的值與 Localizable.strings 中的 key 保持一致就可以了。

最終的程式碼如下:

class NatureViewController: UIViewController {
  @Localized(.natureTitle)
  @IBOutlet private var label: UILabel!
  
  @Localized(.saveNatureButton)
  @IBOutlet private var button: UIButton!
}
複製程式碼

本章結束!關於 @Localized 還有一些潛在功能:

  • 格式化字串資料,並進行動態替換。
  • 能夠確定來自指定的表單和資源包的字串。

想了解更多關於屬性包裝器的知識,請閱讀官方檔案: Properties - The Swift Programming Language (Swift 5.2)

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄