At first glance, using a Swift
enum with a raw type of String seems to be a great way to package (or, if you like, enumerate) magic strings used by things like Notifications:
[gist https://gist.github.com/JoshuaSullivan/cb6d0c6dcfde3f20b43b file=”EnumExample.swift” /]
However, this is a poor application of the Swift enum for the following reason: you are not interested in the enum case, only its raw value. Any place you want to use the magic string in your code you’re forced into fully qualifying the enum case (because the argument type is a string, not the type of your enum) and then accessing the rawValue property.
A better approach is to use a Swift
struct with static constant string members defining the magic strings:
[gist https://gist.github.com/JoshuaSullivan/cb6d0c6dcfde3f20b43b file=”StructExample.swift” /]
The look is very similar to an enum, but in practice it ends up being shorter and cleaner to use:
[gist https://gist.github.com/JoshuaSullivan/cb6d0c6dcfde3f20b43b file=”Usage.swift” /]
Now, this argument is moot if you have a situation where methods in your classes take your enum type as an argument and use the rawValue at some point internally, but for things like userInfo dictionary keys, user defaults keys, notification names, segue names, etc. you are better off with the struct approach, since the string is all you’re interested in.
As with any advice on using Swift, this should not be viewed as an Immutable Truth of the Universe™. There are still situations when an enum would be a perfectly reasonable container for your strings: namely, when you have a model built around the use of the enums and not just the strings they contain.