为什么 Apple 选择使用嵌套结构类型来替换 'String' 类型参数?
Why does Apple choose to use nested struct types to replace 'String' type parameter?
例如:
在新版本Swift之前,我可以这样写:
NSNib(nibNamed: "TagCellView", bundle: nil)
现在 Apple 选择定义很多嵌套结构类型,比如 NSNib.Name
,现在我必须这样写:
NSNib(nibNamed: NSNib.Name("TagCellView"), bundle: nil)
恕我直言,我认为旧版本更干净,Apple 选择背后的原因是什么?
关键是要避免在整个代码中散布字符串。您应该做的是在您的代码中为给定的笔尖定义一次常量。然后在任何需要使用该 nib 名称的地方,您都引用该常量而不是重新键入(可能是错误的)硬编码字符串。
你可以这样定义:
public struct MyNibs {
public static let TagCellView = NSNib.Name("TagCellView")
}
然后将其用作:
let nib = NSNib(nibNamed: MyNibs.TagCellView, bundle: nil)
更简洁的方法是将常量作为扩展添加到 NSNib.Name
:
extension NSNib.Name {
public static let TagCellView = NSNib.Name("TagCellView")
}
那你的使用时间就更短了:
let nib = NSNib(nibNamed: .TagCellView, bundle: nil)
这样,您只需在代码库中输入一次硬编码字符串 "TagCellView"
。您在代码中的其他任何地方都使用 MyNibs.TagCellView
。如果您在 Interface Builder 中重命名笔尖,您只需要更新一行代码而不是几行代码。
当然,没有什么能阻止您在需要引用该笔尖的任何地方键入 NSNib.Name("TagCellView")
,但额外的包袱可能会促使您创建常量。
例如:
在新版本Swift之前,我可以这样写:
NSNib(nibNamed: "TagCellView", bundle: nil)
现在 Apple 选择定义很多嵌套结构类型,比如 NSNib.Name
,现在我必须这样写:
NSNib(nibNamed: NSNib.Name("TagCellView"), bundle: nil)
恕我直言,我认为旧版本更干净,Apple 选择背后的原因是什么?
关键是要避免在整个代码中散布字符串。您应该做的是在您的代码中为给定的笔尖定义一次常量。然后在任何需要使用该 nib 名称的地方,您都引用该常量而不是重新键入(可能是错误的)硬编码字符串。
你可以这样定义:
public struct MyNibs {
public static let TagCellView = NSNib.Name("TagCellView")
}
然后将其用作:
let nib = NSNib(nibNamed: MyNibs.TagCellView, bundle: nil)
更简洁的方法是将常量作为扩展添加到 NSNib.Name
:
extension NSNib.Name {
public static let TagCellView = NSNib.Name("TagCellView")
}
那你的使用时间就更短了:
let nib = NSNib(nibNamed: .TagCellView, bundle: nil)
这样,您只需在代码库中输入一次硬编码字符串 "TagCellView"
。您在代码中的其他任何地方都使用 MyNibs.TagCellView
。如果您在 Interface Builder 中重命名笔尖,您只需要更新一行代码而不是几行代码。
当然,没有什么能阻止您在需要引用该笔尖的任何地方键入 NSNib.Name("TagCellView")
,但额外的包袱可能会促使您创建常量。