- 原文地址:Localize Swift Application
- 原文做者:Dmytro Pylypenko
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:chaingangway
- 校对者:Bruce-pac
您好,Swift 开发者,在本文中,我想与您分享个人经验和知识,主要内容有属性包装器(Property Wrapper)的使用,以及如何简化代码并使其易于维护。我会经过几个主题对此进行说明。html
在 Swift 5.1 中,Apple 引入了属性包装器,它可让咱们在属性和访问逻辑(getter 和 setter)之间设置中间层。前端
下面的内容是在 @IBOutlet
变量内部使用属性包装器的简便方法来实现应用本地化。android
优化下面这个基础版本:ios
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
改进代码,以下:git
class NatureViewController: UIViewController {
@Localized("natureTitle")
@IBOutlet private var label: UILabel!
@Localized("saveNatureButton")
@IBOutlet private var button: UIButton!
}
复制代码
这代码看起来很优雅,不是吗?下面让咱们建立 @Localized
属性包装器。 将 key 当作枚举来使用会更好,如:@Localized(.natureTitle)
。github
@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
协议, 咱们要实现 UILabel
和 UIButton
的扩展方法。swift
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 保持一致就能够了。app
最终的代码以下:ide
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 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。