我不明白为什么要创建UIImage
我只在构造函数中传递String
,但是为什么要创建NSImage
我必须在构造函数中传递NSImage.Name
。这个解决方案背后的想法是什么?
代码:
iOS
let image = UIImage(named: "name")
Mac OS
let image = NSImage(named: NSImage.Name("name"))
谢谢。
答案 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
时,您会得到提示,例如,屏幕的长宽比不会是任何值不仅仅是巧合的意义。