Enums in Swift - A Quick overview
Swift is a dynamically changing language as it is still so as to say Under development, however it is the exact opposite. It is a static language that relies on types, etc all for the compiler to understand and reduce errors at runtime. In our blog post today, let us explore enums and their use, they are very powerful and unlike any enums you've seen before in other languages.
There you have it, you have just declared an enum, but it is not very useful as it does not have any members that you want to enumerate.
and there you have it an enum called genres that have the members, One, Two, Three, Four, Five
This just declared a variable that is of type genre
Where the variable is assigned the value held in enum.Four. You could also avoid the use of the prefix genres and straightaway use the
This now enumerates the values and assigns genre.One with 1001 and genres.Two with 1002 and so on. Note that with this declaration we have also added the var type after the name of the enum. This is required if you are using the enums with a '
However you cannot get the value by simply using something like
These can be retrieved as
The rawValue on the other hand is a type value that you can assign to the enum members.
These can be retrieved as
You will see that the string "this is a string with the value of Two" is returned. You could use the functions to encapsulate and return custom results. You could have formatted strings, calculated scores and bonuses, etc. So instead of writing all this code inside of your function and every module you can now house this code in the enum declaration and have a more managed codebase.
Next we can create a developer that is of one of the types as
Let's say we want to know the sound developers makes. We can add a function to the enum called sound that would return the sound made by that particular developerType.
We could simply use
The example above is for illustration purposes and the same can be better managed using other options. If you were writing a game, then you would have a factory method pattern, create DeveloperType as a protocol or an abstract class to inherit from/sub class.
How to declare enums
Declaring enums is easy, simply typeenum genres {
}
There you have it, you have just declared an enum, but it is not very useful as it does not have any members that you want to enumerate.
How to add enumerators to an enum
Adding members to an enum is easy and you need to use the case statement asenum genres {
case One, Two, Three, Four, Five
}
and there you have it an enum called genres that have the members, One, Two, Three, Four, Five
How to use enums
Using enums is also pretty easy and straightforwardvar myGenre:genres
This just declared a variable that is of type genre
Assigning an enum value
Enum values can be assigned to variables as
myGenre = genres.Four
Where the variable is assigned the value held in enum.Four. You could also avoid the use of the prefix genres and straightaway use the
myGenre = .Four
Enumerating values for enum
While in most cases you do not really require a value to be enumerated as can work with the enum.member format, there may be a case where you need to assign a specific value, there are several ways to manage this1. Using a conditional
You could use an if statement to assign values based on the enum
var result:Int = 0
if myGenre == genre.Three {
result = 1003
}
println("Result -> \(result)")
2. Use defined values
You could use the enum with defined values asvar genres:Int{
case One = 1001, Two, Three, Four, Five
}
This now enumerates the values and assigns genre.One with 1001 and genres.Two with 1002 and so on. Note that with this declaration we have also added the var type after the name of the enum. This is required if you are using the enums with a '
rawValue
'However you cannot get the value by simply using something like
println("Result -> \(genres.Two)")
. To get the value stored in that enum member, you need to access it's rawValue property asprintln("Result -> \(genres.Two.rawValue)")
Defined String Values
The example above was declared with values of type Int, the same can be initialised with String values too as
enum genres:String {
case One = "One", Two = "Two", Three = "Three", Four = "Four", Five = "Five"
}
Note all rawValues that are are not of type Int must be declared, so you cannot have partial declarations
HashValue vs RawValue
If you had the enum as we had declared earlier without the type, there is no rawValue available but instead you get a member called hashValue. All enums get a hashValue which is basically like an Index to the order in which the enums were declared. So One will have a hashValue of 0, Two of 1, Three of 2 and so on. The reason for this is that hashValues are based on the first item having the index value of 0.These can be retrieved as
println("The value of myGenres is \(myGenre.hashValue)")
The rawValue on the other hand is a type value that you can assign to the enum members.
These can be retrieved as
println("The value of myGenres is \(myGenre.rawValue)")
That was Easy, What more?
Swift has one more cool trick, it can have functions. So you could define an enum asLoading ....
You will see that the string "this is a string with the value of Two" is returned. You could use the functions to encapsulate and return custom results. You could have formatted strings, calculated scores and bonuses, etc. So instead of writing all this code inside of your function and every module you can now house this code in the enum declaration and have a more managed codebase.
A Cool Example Use
Let's say we want to group our developer contacts in one of the categories (read: enum) of either Ninja, Panda, Pirate or Zombie. So our first step is to create an enum asLoading ....
Next we can create a developer that is of one of the types as
var developer:DeveloperType = .Ninja // Create this of type Ninja
Let's say we want to know the sound developers makes. We can add a function to the enum called sound that would return the sound made by that particular developerType.
Loading ....
We could simply use
println("sound -> \(developer.sound())")
and in this case since the developer is a Ninja, there is no sound ;) Ninjas are known for their stealth. You can add more functions that could further provide things like Weapons of choice, etcLoading ....
Note: While you can add functions and properties, you cannot add stored properties.
The example above is for illustration purposes and the same can be better managed using other options. If you were writing a game, then you would have a factory method pattern, create DeveloperType as a protocol or an abstract class to inherit from/sub class.
Comments
Post a Comment