为什么 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"),但额外的包袱可能会促使您创建常量。