为什么NSImage.Name存在?

时间:2018-07-10 16:47:19

标签: swift macos cocoa

我不明白为什么要创建UIImage我只在构造函数中传递String,但是为什么要创建NSImage我必须在构造函数中传递NSImage.Name。这个解决方案背后的想法是什么?

代码:

iOS

let image = UIImage(named: "name")

Mac OS

let image = NSImage(named: NSImage.Name("name"))

谢谢。

2 个答案:

答案 0 :(得分:6)

期望的是,您拥有一个集中的位置,可以在其中扩展NSImage.Name并使用定义所有图像名称的静态常量。然后,所有代码都引用这些单个成员,而不是重复魔术字符串。

extension NSImage.Name {
    static let square = NSImage.Name("square")
    static let triangle = NSImage.Name("triangle")
    static let circle = NSImage.Name("circle")
}

//...

let image = NSImage(named: .square)

答案 1 :(得分:3)

Apple并不总是坚持这样的决定。在Swift 4.2(Xcode 10)中,NSImage.Name现在只是String的类型别名-它不再是特殊的结构。这样,与仅使用String的参数类型相比,您仍然可以获得一些好处,并且不必将每个调用站点都包装在初始化程序中。

剩余的轻量类型差异是API设计者与开发者之间的通信,即使编译器未强制执行。它告诉您在类型系统允许的范围内,哪种值对实际使用有意义。就像类型TimeInterval的参数允许任何Double一样,但是当您看到TimeInterval时,您会得到提示,例如,屏幕的长宽比不会是任何值不仅仅是巧合的意义。