Like Notification.Name, I believe those types are supposed to help you 
namespace your string constants when you access them. I’d recommend using a 
code gen tool to generate them from your image assets, like:

extension NSImage.Name {
        static let customImage = NSImage.Name(rawValue: “customImage”)
}

Which can then be used like: NSImage(named: .customImage). That’s the ultimate 
use goal. It does make the old code awkward and a pain to migrate though.


Jon

> On Jul 17, 2017, at 11:20 AM, Manfred Schubert via swift-users 
> <swift-users@swift.org> wrote:
> 
> Why are names no longer Strings any more in Swift 4? I am all for type 
> safety, but now things like
> 
> NSImage(named: "Icon.png")
> 
> become
> 
> NSImage(named: NSImage.Name(rawValue: "Icon.png"))
> 
> and
> 
> NSWindowController(windowNibName: "Window")
> 
> becomes
> 
> NSWindowController(windowNibName: NSNib.Name(rawValue: "Window").
> 
> What does this contrived way of wrapping a String into something else gain in 
> me in safety in exchange for this longer and more difficult to read code? For 
> me a "name" is a prime example of a String. If a name isn't one, then nothing 
> is.
> 
> One place where this makes a lot of sense to have is binding, and there is 
> now NSBindingName. But how do I create a binding name for a property in a way 
> that the compiler can check for validity? I only see the constructor from 
> rawValue (String), but if I only create the binding name from a String I gain 
> nothing in security.
> 
> 
> Kind regards,
> 
> Manfred
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to