【问题标题】:Why does Apple choose to use nested struct types to replace 'String' type parameter?为什么 Apple 选择使用嵌套结构类型来替换 'String' 类型参数?
【发布时间】:2018-09-19 11:50:49
【问题描述】:

例如:

在新版 Swift 之前,我可以这样写:

NSNib(nibNamed: "TagCellView", bundle: nil)

现在Apple选择定义很多嵌套结构类型,比如NSNib.Name,现在我必须这样写:

NSNib(nibNamed: NSNib.Name("TagCellView"), bundle: nil)

恕我直言,我认为旧版本更干净,Apple选择背后的原因是什么?

【问题讨论】:

  • 比较 stackoverflow.com/a/45520652/1187415 以了解类似问题以及解释原因的 Swift 邮件列表。
  • @Martin,这实际上并不适用,因为它是一种新的、具体的结构类型,因此在那里有意义。 NSNib.Name 但是只是 String 的别名,所以具体类型的任何好处都不适用。即使扩展NSNib.Name 如下所示,实际上也扩展了String。此外,采用NSNib.Name 的函数可以直接采用字符串,因为它 字符串,同样,采用字符串的函数现在可以采用NSNib.Name,即使它们无事可做带笔尖。如果它是一个具体的类型,它会有所不同,但没有它,我看不到任何好处。

标签: swift struct parameters nested-types


【解决方案1】:

关键是要避免在整个代码中分散字符串。您应该做的是在代码中为给定的 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 中重命名 nib,只需要更新一行代码,而不是几行。

当然,没有什么可以阻止您在需要引用该笔尖的任何地方输入NSNib.Name("TagCellView"),但额外的包袱可能会促使您创建一个常量。

【讨论】:

  • 不确定我是否同意这个答案,原因有两个。一、NSNib.Name 不是类型。它是String 的别名,因此在上面的示例中,您正在扩展NSNib.Name,实际上是在扩展String。任何采用String 的函数都可以采用.TagCellView,因此它不仅仅局限于nib 的使用。至于在代码中保留分散的文字,您可以简单地扩展String,或者更好,就像您的第一个示例一样,定义一个名为MyNibs 的类并公开一个静态tagCellViewString 变量。它不会弄乱String 的api,但仍然可以将您的笔尖名称放在一起。
  • 要点是这个别名没有真正的用途/需要,因为它没有添加任何东西,也没有澄清任何东西,而且由于它不是一个具体的类型,它也不限制任何东西。如果有的话,就像OP所说的那样,它只会使事情变得混乱。如果他们将其设为具体类型(如对原始问题的评论中的链接文章),我会 100% 同意更改,但没有它,我想不出添加它有什么好处,我很乐意在这里被证明是错误的,因为这意味着我会学到一些我不知道的东西。 :)
猜你喜欢
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2018-03-15
  • 2015-09-18
  • 1970-01-01
相关资源
最近更新 更多