{"id":2138,"date":"2016-11-21T20:58:00","date_gmt":"2016-11-22T02:58:00","guid":{"rendered":"http:\/\/jamesonquave.com\/blog\/?p=2138"},"modified":"2016-12-04T20:34:14","modified_gmt":"2016-12-05T02:34:14","slug":"swift-3-tutorial-fundamentals","status":"publish","type":"post","link":"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/","title":{"rendered":"Swift 3 Tutorial &#8211; Fundamentals"},"content":{"rendered":"<h1 id=\"swift-3-tutorial\">Swift 3 Tutorial<\/h1>\n<p><img decoding=\"async\" src=\"http:\/\/i2.wp.com\/tctechcrunch2011.files.wordpress.com\/2014\/06\/img_0256.jpg?w=584&#038;ssl=1\" alt=\"Swift 3 Tutorial\" \/><\/p>\n<p>In this Swift 3 tutorial, we&#8217;ll focus on how beginners may approach going from complete beginner to having a basic grasp on Swift, and we&#8217;ll be working with Swift 3. We chose to write this tutorial because newcomers will find many tutorials out there that are out of date, so it&#8217;s not appropriate to simply write a &#8220;what&#8217;s new in Swift 3&#8221; post. Instead we&#8217;ll approach this from the perspective of someone who has some programming experience in at least one other language, and we&#8217;ll teach you what&#8217;s unique about Swift, and how to use it effectively. Ready? Let&#8217;s go!<\/p>\n<hr>\n<h3 id=\"constants-and-variables\">Constants and Variables<\/h3>\n<p>Any Swift variable is either a constant or not. Not to be confused with the type of the variable, such as Float or Int, constants and variables are just ways to describe terms that hold a value which can change (are mutable), and constants that can not be changed (becuase they are immutable).<\/p>\n<p>To define a constant, use the let keyword.<\/p>\n<p>Example:<\/p>\n<pre><code><div id=\"highlighter_892743\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Jameson\"<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>If you were to try and change the value of name, you would be unable to do so, and the Swift compiler would produce an error.<\/p>\n<pre><code><div id=\"highlighter_116200\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Jameson\"<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">name = <\/code><code class=\"string\">\"Bob\"<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_253695\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">error: cannot assign to value: <\/code><code class=\"string\">'name'<\/code> <code class=\"keyword\">is<\/code> <code class=\"plain\">a <\/code><code class=\"string\">'let'<\/code> <code class=\"plain\">constant<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">name = <\/code><code class=\"string\">\"Bob\"<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">~~~~ ^<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>On the other hand, by using the var keyword, we define a variable that can change:<\/p>\n<pre><code><div id=\"highlighter_110038\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Jameson\"<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">name = <\/code><code class=\"string\">\"Bob\"<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>This code does not produce an error.<\/p>\n<p>In general, you should always default to using the <code>let<\/code> keyword, unless you know you need a <code>var<\/code> keyword. This leads to code that is ultimately safer. If you define a constant, and later attempt to modify it, you will get an error and at that time can determine if you should switch to use the <code>var<\/code> keyword, or if the error is giving you a hint that maybe you should rethink the current logic flow. In general, immutability is preferred over mutability; it simply leads to less programmers errors and makes it easier to reason about your code.<\/p>\n<hr>\n<h3 id=\"basic-types\">Basic Types<\/h3>\n<p>In Swift, a type is indicated by declaring a variable, then putting a colon, folowed by the type name. For example to declare an integer, which is of Swift type <code>Int<\/code>, you could use the following:<\/p>\n<pre><code><div id=\"highlighter_931037\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">age: <\/code><code class=\"color1\">Int<\/code> <code class=\"plain\">= 5<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Or similarly, if you want to declare a string:<\/p>\n<pre><code><div id=\"highlighter_506098\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name: <\/code><code class=\"color1\">String<\/code> <code class=\"plain\">= <\/code><code class=\"string\">\"Jameson\"<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Swift supports type inference, so you can usually omit the type information, and let the compiler determine what the type should be based on it&#8217;s initial value.<\/p>\n<pre><code><div id=\"highlighter_27405\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">age = 5<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Jameson\"<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>The types for <code>age<\/code> and <code>name<\/code> are still <code>Int<\/code> and <code>String<\/code> respectively, but we can skip the type annotation, because it is obvious that <code>5<\/code> is an <code>Int<\/code>, and <code>\"Jameson\"<\/code> is a <code>String<\/code>.<\/p>\n<p>Remember, the <code>let<\/code> keyword simply makes these values constant. If we expected the value of age to change, but not name, we might write these declarations like so:<\/p>\n<pre><code><div id=\"highlighter_247526\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">age = 5<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Jameson\"<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Now if we want to update the <code>age<\/code> value, it&#8217;s possible to do:<\/p>\n<pre><code><div id=\"highlighter_663642\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">age = 5<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Jameson\"<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">age = 25<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(age)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_411727\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">25<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<hr>\n<h3 id=\"working-with-strings\">Working with Strings<\/h3>\n<p>It&#8217;s frequently useful to print a command to the console or otherwise evaluate a <code>String<\/code> containing other variables. For example, I might want to form a sentence with my variables <code>age<\/code> and <code>name<\/code> and print it to the console. I can do this using the <code>+<\/code> operator between each <code>String<\/code>.<\/p>\n<pre><code><div id=\"highlighter_361602\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">age = <\/code><code class=\"string\">\"15\"<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Robb\"<\/code><\/div><div class=\"line number3 index2 alt2\">&nbsp;<\/div><div class=\"line number4 index3 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">sentence = name + <\/code><code class=\"string\">\" is \"<\/code> <code class=\"plain\">+ age<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">(sentence)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_536343\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Robb<\/code> <code class=\"keyword\">is<\/code> <code class=\"plain\">15<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>A shortcut for this is to write your <code>String<\/code> as you normally would without the <code>+<\/code> operator seperating each string, and put each variable inside of a set of parentheses, preceeded by a backslash <code>\\<\/code>.<\/p>\n<pre><code><div id=\"highlighter_150591\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">sentence = <\/code><code class=\"string\">\"\\(name) is \\(age)\"<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(sentence)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_267034\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Robb<\/code> <code class=\"keyword\">is<\/code> <code class=\"plain\">15<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>As you can see this has the same effect, but is much easier to read and compose sentences.<\/p>\n<p>One thing you may have noticed is that <code>age<\/code> is now of type <code>String<\/code> because it was assigned the value <code>\"15\"<\/code> instead of just <code>15<\/code> without the quotes. This is because concatenating a <code>String<\/code> and an <code>Int<\/code> will not automatically cast the <code>Int<\/code> to <code>String<\/code>, which is a neccessary step before concatenating is possible.<\/p>\n<p>Or in other words, this code will produce an error:<\/p>\n<pre><code><div id=\"highlighter_570859\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">age = 15<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Robb\"<\/code><\/div><div class=\"line number3 index2 alt2\">&nbsp;<\/div><div class=\"line number4 index3 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">sentence = name + <\/code><code class=\"string\">\" is \"<\/code> <code class=\"plain\">+ age<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">(sentence)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_436892\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Error<\/code><code class=\"plain\">: <\/code><code class=\"color2\">Binary<\/code> <code class=\"keyword\">operator<\/code> <code class=\"string\">'+'<\/code> <code class=\"plain\">cannot be applied to operands of type <\/code><code class=\"string\">'String'<\/code> <code class=\"plain\">and <\/code><code class=\"string\">'Int'<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>So what we have to do is get <code>age<\/code> converted to a <code>String<\/code> before using it here. Thing is done by <code>casting<\/code> the variable. Simply call the String constructor and pass in the <code>Int<\/code> value:<\/p>\n<pre><code><div id=\"highlighter_277408\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">age = 15<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Robb\"<\/code><\/div><div class=\"line number3 index2 alt2\">&nbsp;<\/div><div class=\"line number4 index3 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">stringAge = <\/code><code class=\"color2\">String<\/code><code class=\"plain\">(age)<\/code><\/div><div class=\"line number5 index4 alt2\">&nbsp;<\/div><div class=\"line number6 index5 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">sentence = name + <\/code><code class=\"string\">\" is \"<\/code> <code class=\"plain\">+ stringAge<\/code><\/div><div class=\"line number7 index6 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">(sentence)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_728477\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Robb<\/code> <code class=\"keyword\">is<\/code> <code class=\"plain\">15<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>We created a new variable called <code>stringAge<\/code> here, but we also could have performed the cast in-place, because the string interpolation will evaluate each expression separately, and the same goes for the contents of the parenthesis when interpolating strings that way:<\/p>\n<pre><code><div id=\"highlighter_387687\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">age = 15<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Robb\"<\/code><\/div><div class=\"line number3 index2 alt2\">&nbsp;<\/div><div class=\"line number4 index3 alt1\"><code class=\"keyword\">let<\/code> <code class=\"plain\">sentence = name + <\/code><code class=\"string\">\" is \"<\/code> <code class=\"plain\">+ <\/code><code class=\"color1\">String<\/code><code class=\"plain\">(age)<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">(sentence)<\/code><\/div><div class=\"line number6 index5 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"\\(name) enjoys being \\(String(age))\"<\/code><code class=\"plain\">)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_71789\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Robb<\/code> <code class=\"keyword\">is<\/code> <code class=\"plain\">15<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"color2\">Robb<\/code> <code class=\"plain\">enjoys being<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">15<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<hr>\n<h3 id=\"optionals\">Optionals<\/h3>\n<p>In Swift, there is also the concept of the <em>optional<\/em>. An optional is just a variable that can be nil, null, or otherwise not set to any value. In general, you can think of any variable in most other programming languages as being an optional. The &#8220;optionality&#8221; of a variable is declared by appending a question mark (?) on to the end of the type name in a type annotation. So continuing the example above, where we know age and name will always be set, we might want to add another variable that could be <code>nil<\/code>, because it is possible that it just isn&#8217;t present. Let&#8217;s use <code>favoriteColor<\/code> as an example. Many people have a favorite color, but it&#8217;s possible someone doesn&#8217;t, or we just don&#8217;t have the data. We would declare this variable as an optional, and not assign it to any value.<\/p>\n<pre><code><div id=\"highlighter_252173\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteColor: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Implicit in the declaration of an optional with no value set, is the assignment to nil. We can verify this by examining the value of favoriteColor after declaring it as an optional by printing it to the console using the <code>print()<\/code> function.<\/p>\n<pre><code><div id=\"highlighter_586223\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteColor: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(favoriteColor)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_474590\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">nil<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>We can later assign something to <code>favoriteColor<\/code> and see that it is no longer <code>nil<\/code>.<\/p>\n<pre><code><div id=\"highlighter_818081\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteColor: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">favoriteColor = <\/code><code class=\"string\">\"Blue\"<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">(favoriteColor)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_922886\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Optional<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Note that instead of just getting the string <code>\"Blue\"<\/code>, we get <code>Optional(\"Blue\")<\/code>. This is because the value is still &#8220;wrapped&#8221; inside of the optional.<\/p>\n<p>You can think of optionals like a birthday gift. The box the gift comes in, wrapped up in some paper with pretty balloons on it, could actually be empty. A rather cruel gift to give someone on their birthday, but it&#8217;s possible to do. It could also have something inside of it. But either way, if we pick it up and look at it, what we have is not the thing inside of of it in our hands, but it&#8217;s just the wrapped box itself.<\/p>\n<p>If we want to get at the thing inside, we need to unwrap the gift first. This is the same way optionals work. When we pass around optional variables and interact with them, we&#8217;re really working with a container that may or may not have anything inside of it. Similar to our gift, the optional must be <strong>unwrapped<\/strong> before it can be used.<\/p>\n<p>Declaring our optional with no value is valid Swift and will compile just fine. But, if we tried to declare this variable without the optional syntax, it would present an error.<\/p>\n<p>There are also variables in Swift that are not optional. They <em>always<\/em> have a value. If you tried to assign nil to a non-optional variable, you will get a compiler error:<\/p>\n<pre><code><div id=\"highlighter_788967\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteColor = <\/code><code class=\"string\">\"Blue\"<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">favoriteColor = <\/code><code class=\"keyword\">nil<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_124964\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">error: <\/code><code class=\"keyword\">nil<\/code> <code class=\"plain\">cannot be assigned to type <\/code><code class=\"string\">'String'<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Similarly, non-optional values can not be assigned to nil during their declaration:<\/p>\n<pre><code><div id=\"highlighter_141717\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteColor: <\/code><code class=\"color1\">String<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_36370\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">error: variables must have an initial value<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<hr>\n<h3 id=\"unwrapping-optionals\">Unwrapping Optionals<\/h3>\n<p>So we know what optionals are, and that they allow for a variable to become nil, and we know that optionals are containers rather than values themeselves. So, in our programs when we want to access the contents of an optional, how do we do it? There are several ways so let&#8217;s go over them now.<\/p>\n<p>First, and most commonly, you will unwrap optionals using <em>optional binding<\/em>. In optional binding, you will assign a new variable to the value of an optional within an if statement. If the optional contains a value, this variable will be set, and the code block following this statement will be executed.<\/p>\n<p>Let&#8217;s look at an example. Here we will declare two optionals, one called <code>favoriteAnimal<\/code> which is set to <code>Fox<\/code>, and one set to <code>favoriteSong<\/code>, which we will not set (it will remain <code>nil<\/code>)<\/p>\n<pre><code><div id=\"highlighter_640345\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteAnimal: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteSong: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><div class=\"line number3 index2 alt2\">&nbsp;<\/div><div class=\"line number4 index3 alt1\"><code class=\"plain\">favoriteAnimal = <\/code><code class=\"string\">\"Fox\"<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Let&#8217;s employ optional binding to discover if each variable is set, and if so we&#8217;ll print a sentence containing the value to the console. First we&#8217;ll do it with <code>favoriteAnimal<\/code>.<\/p>\n<pre><code><div id=\"highlighter_251541\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">if<\/code> <code class=\"keyword\">let<\/code> <code class=\"plain\">unwrappedFavoriteAnimal = favoriteAnimal {<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"Favorite animal is: \"<\/code> <code class=\"plain\">+ unwrappedFavoriteAnimal)<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_462885\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Favorite<\/code> <code class=\"plain\">animal <\/code><code class=\"keyword\">is<\/code><code class=\"plain\">: <\/code><code class=\"color2\">Fox<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>In the event that the value is not set, we simply will trigger whatever is in the <code>else<\/code> block, or nothing at all if an <code>else<\/code> block isn&#8217;t specified.<\/p>\n<pre><code><div id=\"highlighter_712052\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">if<\/code> <code class=\"keyword\">let<\/code> <code class=\"plain\">unwrappedFavoriteSong = favoriteSong {<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"Favorite song is: \"<\/code> <code class=\"plain\">+ unwrappedFavoriteSong)<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">}<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"keyword\">else<\/code> <code class=\"plain\">{<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"I don't know what your favorite song is!\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number6 index5 alt1\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_413926\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">I don't know what your favorite song <\/code><code class=\"keyword\">is<\/code><code class=\"plain\">!<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>If we need to unwrap multiple optionals, and we require all of them to proceed with a bit of logic, we need to check each one:<\/p>\n<pre><code><div id=\"highlighter_266727\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteAnimal: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteSong: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><div class=\"line number3 index2 alt2\">&nbsp;<\/div><div class=\"line number4 index3 alt1\"><code class=\"plain\">favoriteAnimal = <\/code><code class=\"string\">\"Fox\"<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"plain\">favoriteSong = <\/code><code class=\"string\">\"Shake it Off\"<\/code><\/div><div class=\"line number6 index5 alt1\">&nbsp;<\/div><div class=\"line number7 index6 alt2\"><code class=\"keyword\">if<\/code> <code class=\"keyword\">let<\/code> <code class=\"plain\">unwrappedFavoriteSong = favoriteSong {<\/code><\/div><div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"keyword\">if<\/code> <code class=\"keyword\">let<\/code> <code class=\"plain\">unwrappedFavoriteAnimal = favoriteAnimal {<\/code><\/div><div class=\"line number9 index8 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(unwrappedFavoriteSong + <\/code><code class=\"string\">\" \"<\/code> <code class=\"plain\">+ unwrappedFavoriteAnimal)<\/code><\/div><div class=\"line number10 index9 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"plain\">}<\/code><\/div><div class=\"line number11 index10 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>This gets kind of messy kind of fast, so Swift offers a shortcut to unwrap multiple variables at once:<\/p>\n<pre><code><div id=\"highlighter_140989\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteAnimal: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">var<\/code> <code class=\"plain\">favoriteSong: <\/code><code class=\"color1\">String<\/code><code class=\"plain\">?<\/code><\/div><div class=\"line number3 index2 alt2\">&nbsp;<\/div><div class=\"line number4 index3 alt1\"><code class=\"plain\">favoriteAnimal = <\/code><code class=\"string\">\"Fox\"<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"plain\">favoriteSong = <\/code><code class=\"string\">\"Shake it Off\"<\/code><\/div><div class=\"line number6 index5 alt1\">&nbsp;<\/div><div class=\"line number7 index6 alt2\"><code class=\"keyword\">if<\/code> <code class=\"keyword\">let<\/code> <code class=\"plain\">unwrappedFavoriteSong = favoriteSong,<\/code><\/div><div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">unwrappedFavoriteAnimal = favoriteAnimal {<\/code><\/div><div class=\"line number9 index8 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(unwrappedFavoriteSong + <\/code><code class=\"string\">\" \"<\/code> <code class=\"plain\">+ unwrappedFavoriteAnimal)<\/code><\/div><div class=\"line number10 index9 alt1\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<hr>\n<h3 id=\"collections\">Collections<\/h3>\n<p>Swift has multiple collection types, the most common of which being arrays, sets, and dictionaries.<\/p>\n<p><strong>Array<\/strong><\/p>\n<p>Let&#8217;s take a look at an example of an <code>Array<\/code><\/p>\n<pre><code><div id=\"highlighter_869805\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">starks: [<\/code><code class=\"color2\">String<\/code><code class=\"plain\">] = [<\/code><code class=\"string\">\"Eddard\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Catelyn\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Robb\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Sansa\"<\/code><code class=\"plain\">]<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Here we have a basic <code>Array<\/code>, which is of type <code>[String]<\/code>. The square brackets indicate that this is an array of <code>String<\/code> objects, rather than just being a single <code>String<\/code>. As usual, Swift can infer this type data too, just by examining the initial assignment:<\/p>\n<pre><code><div id=\"highlighter_474243\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">starks = [<\/code><code class=\"string\">\"Robb\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Sansa\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Jon\"<\/code><code class=\"plain\">]<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>We can access elements of this array in a variety of ways, such as using an <code>Int<\/code> index, calling the various collections methods.<\/p>\n<pre><code><div id=\"highlighter_568423\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">starks = [<\/code><code class=\"string\">\"Robb\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Sansa\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Jon\"<\/code><code class=\"plain\">]<\/code><\/div><div class=\"line number2 index1 alt1\">&nbsp;<\/div><div class=\"line number3 index2 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">( starks[0] )<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">( starks[2] )<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">( starks.first! )<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_750470\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Robb<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"color2\">Arya<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"color2\">Robb<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>You&#8217;ll note that arrays are zero-indexed, so the first element in the array <code>\"Robb\"<\/code> is accessed using <code>starks[0]<\/code><\/p>\n<p>Additionally, you may notice that while the <code>first<\/code> method returns an optional (and therefore is being force-unwrapped with the <code>!<\/code> symbol), the indexed accessors does not return an optional. If you try to access an index in an array that is not present, your program will fail at runtime! So always check the length of arrays when accessing by index:<\/p>\n<pre><code><div id=\"highlighter_909853\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">if<\/code> <code class=\"plain\">starks.count &gt;= 4 {<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">( starks[3] )<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>There are ways to make this type of checking automated, but it is not done by default for performance reasons.<\/p>\n<p><strong>Hashable Types \/ Dictionary<\/strong><\/p>\n<p>Dictionaries are able to store values based on a key, typically the key is of type <code>String<\/code>, but it could actually be many different Swift types. In this example we create a basic <code>Dictionary<\/code> with <code>String<\/code> keys and <code>Int<\/code> values for the age of each person:<\/p>\n<pre><code><div id=\"highlighter_821323\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">ages = [<\/code><code class=\"string\">\"Robb\"<\/code><code class=\"plain\">: 15, <\/code><code class=\"string\">\"Sansa\"<\/code><code class=\"plain\">: 12, <\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">: 10, <\/code><code class=\"string\">\"Jon\"<\/code><code class=\"plain\">: 15]<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>We can access these values by their <code>String<\/code> keys:<\/p>\n<pre><code><div id=\"highlighter_642334\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">( ages[<\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">]! )<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">( ages[<\/code><code class=\"string\">\"Jon\"<\/code><code class=\"plain\">]! )<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_507699\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">10<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">15<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Note that we&#8217;re unwrapping these because they are optional values, and could potentailly be nil. It is generally safer to use optional binding to unwrap the value from a <code>Dictionary<\/code>, especially if you have reason to believe the value could often be <code>nil<\/code>.<\/p>\n<pre><code><div id=\"highlighter_835173\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">if<\/code> <code class=\"keyword\">let<\/code> <code class=\"plain\">aryasAge = ages[<\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">] {<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"Arya is \\(aryasAge) years old\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_61889\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Arya<\/code> <code class=\"keyword\">is<\/code> <code class=\"plain\">10 years old<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>We can also store arrays inside of dictionaries, or dictionaries inside of arrays, or a mix of both.<\/p>\n<pre><code><div id=\"highlighter_825025\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">families = [<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"string\">\"Stark\"<\/code><code class=\"plain\">: [<\/code><code class=\"string\">\"Robb\"<\/code><code class=\"plain\">: 15, <\/code><code class=\"string\">\"Sansa\"<\/code><code class=\"plain\">: 12, <\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">: 10, <\/code><code class=\"string\">\"Jon\"<\/code><code class=\"plain\">: 15],<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"string\">\"Baratheon\"<\/code><code class=\"plain\">: [<\/code><code class=\"string\">\"Joffrey\"<\/code><code class=\"plain\">: 13, <\/code><code class=\"string\">\"Tommen\"<\/code><code class=\"plain\">: 8]<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"plain\">]<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">tommensAge = families[<\/code><code class=\"string\">\"Baratheon\"<\/code><code class=\"plain\">]![<\/code><code class=\"string\">\"Tommen\"<\/code><code class=\"plain\">]!<\/code><\/div><div class=\"line number6 index5 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"Tommen is \\(tommensAge) years old\"<\/code><code class=\"plain\">)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_987121\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Tommen<\/code> <code class=\"keyword\">is<\/code> <code class=\"plain\">8 years old<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>The type of <code>houses<\/code> here would be <code>[String: [String: Int]]<\/code><br \/>\nOr in other words it is a dictionary with a <code>String<\/code> key, and it&#8217;s values are <code>[String: Int]<\/code>, another dictionary with <code>String<\/code> keys and <code>Int<\/code> values.<\/p>\n<p><strong>Set<\/strong><\/p>\n<p>A Swift 3 <code>Set<\/code> is similar to an <code>Array<\/code>, except the values in a <code>Set<\/code> are <em>unique<\/em> and <em>unordered<\/em>.<\/p>\n<p>Initializing a <code>Set<\/code> looks almost exactly like intitializing an <code>Array<\/code>, the only different is the type:<\/p>\n<pre><code><div id=\"highlighter_753976\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">colors: <\/code><code class=\"color2\">Set<\/code><code class=\"plain\">&lt;<\/code><code class=\"color2\">String<\/code><code class=\"plain\">&gt; = [<\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Red\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Orange\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">]<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>This code creates a new set of type <code>String<\/code>. The greater than \/ less than symbols <code>&lt;<\/code> and <code>&gt;<\/code> are used to indicate Swift generic types, including the types of a <code>Set<\/code> as shown here.<\/p>\n<p>You&#8217;ll notice we included <code>\"Blue\"<\/code> twice in our list, but if we print out the contents of <code>colors<\/code>, we only see it once:<\/p>\n<pre><code><div id=\"highlighter_301717\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">colors: <\/code><code class=\"color2\">Set<\/code><code class=\"plain\">&lt;<\/code><code class=\"color2\">String<\/code><code class=\"plain\">&gt; = [<\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Red\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Orange\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">]<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(colors)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_75450\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">[<\/code><code class=\"string\">\"Orange\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Red\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">]<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>You may also notice that the ordering is inconsistent. Sets do not maintain any particular order for their contents.<\/p>\n<p>We can not access members of a <code>Set<\/code> using indexes as we can with arrays, but instead we use the methods built-in to the <code>Set<\/code> type to add and remove objects. We can also call the <code>contains<\/code> method to check if the <code>Set<\/code> includes something.<\/p>\n<pre><code><div id=\"highlighter_256358\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">var<\/code> <code class=\"plain\">colors: <\/code><code class=\"color2\">Set<\/code><code class=\"plain\">&lt;<\/code><code class=\"color2\">String<\/code><code class=\"plain\">&gt; = [<\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Red\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Orange\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">]<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">colors.insert(<\/code><code class=\"string\">\"Black\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">colors.insert(<\/code><code class=\"string\">\"Black\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"plain\">colors.remove(<\/code><code class=\"string\">\"Red\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">(colors)<\/code><\/div><div class=\"line number6 index5 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(colors.contains(<\/code><code class=\"string\">\"Black\"<\/code><code class=\"plain\">))<\/code><\/div><div class=\"line number7 index6 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">(colors.contains(<\/code><code class=\"string\">\"Red\"<\/code><code class=\"plain\">))<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_969005\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">[<\/code><code class=\"string\">\"Black\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Orange\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Blue\"<\/code><code class=\"plain\">]<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">true<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"keyword\">false<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Constructing sets of objects is a common way to catalogue what is included or excluded in a list of things, as long as there is no need to order or have duplicates of the objects.<\/p>\n<p>There are many methods I have not mentioned, and I would encourage you to read through Apple&#8217;s documentation on each of these three classes to further familiarize yourself with them.<\/p>\n<p><strong>Tuples<\/strong><\/p>\n<p>Tuples are not technicaly a collection, but instead simply multiple variables that can be passed around with a single identifier.<\/p>\n<pre><code><div id=\"highlighter_34868\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">fullName = (<\/code><code class=\"string\">\"Jameson\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Quave\"<\/code><code class=\"plain\">)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>The type of the <code>tuple<\/code> here is <code>(String, String)<\/code>, and we can manually access each numbered tuple element using dot-syntax, followed by the index:<\/p>\n<pre><code><div id=\"highlighter_906583\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">fullName = (<\/code><code class=\"string\">\"Jameson\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Quave\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(fullName.1)<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"functions\">print<\/code><code class=\"plain\">(fullName.0)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_474528\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Quave<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"color2\">Jameson<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Tuples can also be deconstructed in to new variable names:<\/p>\n<pre><code><div id=\"highlighter_805749\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">(first, last) = (<\/code><code class=\"string\">\"Jameson\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Quave\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(first)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_629172\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Jameson<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Since we&#8217;re not using the last name here, we could just ignore that value by using an underscore <code>_<\/code> and still deconstruct the first name:<\/p>\n<pre><code><div id=\"highlighter_78337\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">(first, _) = (<\/code><code class=\"string\">\"Jameson\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Quave\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"functions\">print<\/code><code class=\"plain\">(first)<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_343362\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Jameson<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Tuples are useful when you have a method that you want to return multiple values.<\/p>\n<h3 id=\"control-flow\">Control Flow<\/h3>\n<p>Control flow in Swift looks pretty similar to other languages. At the most basic level we have the <code>if<\/code> and <code>else<\/code> statements.<\/p>\n<pre><code><div id=\"highlighter_681034\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">if<\/code> <code class=\"plain\">10 &gt; 5 {<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"10 is greater than 5.\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">}<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"keyword\">else<\/code> <code class=\"plain\">{<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"10 is not greater than five.\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number6 index5 alt1\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_70289\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">10 <\/code><code class=\"keyword\">is<\/code> <code class=\"plain\">greater than 5<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>You can alternatively put your conditions for an if statement in parenthesis:<\/p>\n<pre><code><div id=\"highlighter_371519\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">if<\/code> <code class=\"plain\">(10 &gt; 5) {<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">...<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Swift also support the switch statement, and checks at compile for whether or not you have exhaustively covered all possibilities. If you do not (or can not) specifically handle all possibiities, then you can use the <code>default:<\/code> case to handle everything not explicitly handled.<\/p>\n<pre><code><div id=\"highlighter_267788\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Jameson\"<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">switch<\/code><code class=\"plain\">(name) {<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"keyword\">case<\/code> <code class=\"string\">\"Joe\"<\/code><code class=\"plain\">:<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"Name is Joe\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"keyword\">case<\/code> <code class=\"string\">\"Jameson\"<\/code><code class=\"plain\">:<\/code><\/div><div class=\"line number6 index5 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"This is Jameson\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number7 index6 alt2\"><code class=\"keyword\">default<\/code><code class=\"plain\">:<\/code><\/div><div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"I don't know of this person!\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number9 index8 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_112316\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">This<\/code> <code class=\"keyword\">is<\/code> <code class=\"color2\">Jameson<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Here because the value of <code>name<\/code> is <code>\"This is Jameson\"<\/code>, we match the 2nd case and execute the line<\/p>\n<pre><code><div id=\"highlighter_927189\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">...<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"This is Jameson\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">...<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>If however we set the name to be something not present in our list of cases, such as <code>\"Jason\"<\/code>, the switch would fall back to the <code>default<\/code> case.<\/p>\n<pre><code><div id=\"highlighter_177497\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">name = <\/code><code class=\"string\">\"Jason\"<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">switch<\/code><code class=\"plain\">(name) {<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"keyword\">case<\/code> <code class=\"string\">\"Joe\"<\/code><code class=\"plain\">:<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"Name is Joe\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"keyword\">case<\/code> <code class=\"string\">\"Jameson\"<\/code><code class=\"plain\">:<\/code><\/div><div class=\"line number6 index5 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"This is Jameson\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number7 index6 alt2\"><code class=\"keyword\">default<\/code><code class=\"plain\">:<\/code><\/div><div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"I don't know of this person!\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number9 index8 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_404019\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">I don't know of this person!<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p><strong>Loops and Collections<\/strong><\/p>\n<p>Swift 3 does not support the classical C-style for loops you may be used to, and instead opts for enumeration and for-each style loops for the <code>for element in array<\/code> syntax.<\/p>\n<p>For example if we have an array <code>names<\/code>, and we want to print each one seperately, we can do so with a for loop:<\/p>\n<pre><code><div id=\"highlighter_294292\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">names = [<\/code><code class=\"string\">\"Robb\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Sansa\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Jon\"<\/code><code class=\"plain\">]<\/code><\/div><div class=\"line number2 index1 alt1\">&nbsp;<\/div><div class=\"line number3 index2 alt2\"><code class=\"keyword\">for<\/code> <code class=\"plain\">name <\/code><code class=\"keyword\">in<\/code> <code class=\"plain\">names {<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"Name: \\(name)\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_997694\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Name<\/code><code class=\"plain\">: <\/code><code class=\"color2\">Robb<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"color2\">Name<\/code><code class=\"plain\">: <\/code><code class=\"color2\">Sansa<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"color2\">Name<\/code><code class=\"plain\">: <\/code><code class=\"color2\">Arya<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"color2\">Name<\/code><code class=\"plain\">: <\/code><code class=\"color2\">Jon<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>This is great if you happen to want to loop over an array, but without C-style arrays, how would we loop over a series of numbers? The answer comes in the form of Swift&#8217;s <code>Range<\/code> and <code>Stride<\/code>. Let&#8217;s say we wanted to count to 10, by threes, we could do that by using a <code>Range<\/code> from 1 to 10 using the syntax <code>1...10<\/code>. Then we could only print each number that is evenly divisible by three by using the modulo <code>%<\/code> operator and checking for a remainder of 0.<\/p>\n<pre><code><div id=\"highlighter_263321\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">for<\/code> <code class=\"plain\">i <\/code><code class=\"keyword\">in<\/code> <code class=\"plain\">1...10 {<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"keyword\">if<\/code> <code class=\"plain\">i % 3 == 0 {<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(i)<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"plain\">}<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_950714\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">3<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">6<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">9<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>There is another option however, to only iterate every third item (or any arbitrary delta), known as a <code>stride<\/code>. A <code>stride<\/code> can be created using a variety of methods, but the most common is <code>stride(from: , to:, by:)<\/code> where the <code>from<\/code> value is where the stride starts, <code>to<\/code> is where it ends, and <code>by<\/code> is how much each value changes to approach the <code>to<\/code>. If that sounds a little confusing just look at this code sample<\/p>\n<pre><code><div id=\"highlighter_447874\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">byThrees = stride(from: 3, to: 10, by: 3)<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">for<\/code> <code class=\"plain\">n <\/code><code class=\"keyword\">in<\/code> <code class=\"plain\">byThrees {<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(n)<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_190295\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">3<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">6<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">9<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>It&#8217;s almost readable in english, you might say you are &#8220;counting&#8221; from 3 to 10 by 3. Here we create a <code>stride<\/code> and store it in a variable named <code>byThrees<\/code>, but we could use it directly in the loop as well:<\/p>\n<pre><code><div id=\"highlighter_94451\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">for<\/code> <code class=\"plain\">n <\/code><code class=\"keyword\">in<\/code> <code class=\"plain\">stride(from: 3, to: 10, by: 3) {<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(n)<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_745073\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">3<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">6<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">9<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>Collections also all have an <code>indices<\/code> property that can be used to loops. This returns an array of the indices a collection has, useful for iterating or filtering some but not all of a collection. For example, back in our name collection we may want only the first three names, which we can retrieve like so:<\/p>\n<pre><code><div id=\"highlighter_663517\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">names = [<\/code><code class=\"string\">\"Robb\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Sansa\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Jon\"<\/code><code class=\"plain\">]<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">for<\/code> <code class=\"plain\">nameIndex <\/code><code class=\"keyword\">in<\/code> <code class=\"plain\">names.indices {<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"keyword\">if<\/code><code class=\"plain\">(nameIndex &lt; 3) {<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(names[nameIndex])<\/code><\/div><div class=\"line number5 index4 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"plain\">}<\/code><\/div><div class=\"line number6 index5 alt1\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_347686\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"color2\">Robb<\/code><code class=\"plain\">, <\/code><code class=\"color2\">Sansa<\/code><code class=\"plain\">, <\/code><code class=\"color2\">Arya<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>There is also the <code>enumerate<\/code> method on collections, that allow you to get both the index and value from an array as you loop over it:<\/p>\n<pre><code><div id=\"highlighter_699853\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"keyword\">let<\/code> <code class=\"plain\">names = [<\/code><code class=\"string\">\"Robb\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Sansa\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Arya\"<\/code><code class=\"plain\">, <\/code><code class=\"string\">\"Jon\"<\/code><code class=\"plain\">]<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"keyword\">for<\/code> <code class=\"plain\">(index, name) <\/code><code class=\"keyword\">in<\/code> <code class=\"plain\">names.enumerated() {<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"undefined spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"functions\">print<\/code><code class=\"plain\">(<\/code><code class=\"string\">\"\\(index): \\(name)\"<\/code><code class=\"plain\">)<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"plain\">}<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<pre><code><div id=\"highlighter_289460\" class=\"syntaxhighlighter nogutter highlightedCode \"><table border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr><td class=\"code\"><div class=\"container\"><div class=\"line number1 index0 alt2\"><code class=\"plain\">0: <\/code><code class=\"color2\">Robb<\/code><\/div><div class=\"line number2 index1 alt1\"><code class=\"plain\">1: <\/code><code class=\"color2\">Sansa<\/code><\/div><div class=\"line number3 index2 alt2\"><code class=\"plain\">2: <\/code><code class=\"color2\">Arya<\/code><\/div><div class=\"line number4 index3 alt1\"><code class=\"plain\">3: <\/code><code class=\"color2\">Jon<\/code><\/div><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/code><\/pre>\n<p>There are still more ways to enumerate loop over objects in Swift 3, but these are the most commonly used.<\/p>\n<p>You may notice in our for loop we are assigning to two variables at once, both <code>index<\/code> and <code>name<\/code>. These are seperated by commas and surrounded by parenthesis in orer to delineate there are two named variable we expect returned from the <code>enumerated()<\/code> method. These are techincally deconstructed <code>tuples<\/code>.<\/p>\n<p>This concluded the fundamentals portion of the Swift 3 tutorial. Next, I&#8217;ll show you how to use what you&#8217;ve learned here in real-world scenarios. Keep up with these posts by subscribing below. You&#8217;ll be emailed when I make new posts, and post video tutorials and other neat stuff, never spam \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Swift 3 Tutorial In this Swift 3 tutorial, we&#8217;ll focus on how beginners may approach going from complete beginner to having a basic grasp on Swift, and we&#8217;ll be working with Swift 3. We chose to write this tutorial because newcomers will find many tutorials out there that are out of date, so it&#8217;s not&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_links_to":"","_links_to_target":""},"categories":[10,89,91],"tags":[34,33,92,36],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Swift 3 Tutorial - Fundamentals - Jameson Quave<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Swift 3 Tutorial - Fundamentals - Jameson Quave\" \/>\n<meta property=\"og:description\" content=\"Swift 3 Tutorial In this Swift 3 tutorial, we&#8217;ll focus on how beginners may approach going from complete beginner to having a basic grasp on Swift, and we&#8217;ll be working with Swift 3. We chose to write this tutorial because newcomers will find many tutorials out there that are out of date, so it&#8217;s not...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/\" \/>\n<meta property=\"og:site_name\" content=\"Jameson Quave\" \/>\n<meta property=\"article:published_time\" content=\"2016-11-22T02:58:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-12-05T02:34:14+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/i2.wp.com\/tctechcrunch2011.files.wordpress.com\/2014\/06\/img_0256.jpg?w=584&ssl=1\" \/>\n<meta name=\"author\" content=\"Jameson Quave\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jameson Quave\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/\",\"url\":\"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/\",\"name\":\"Swift 3 Tutorial - Fundamentals - Jameson Quave\",\"isPartOf\":{\"@id\":\"https:\/\/jamesonquave.com\/blog\/#website\"},\"datePublished\":\"2016-11-22T02:58:00+00:00\",\"dateModified\":\"2016-12-05T02:34:14+00:00\",\"author\":{\"@id\":\"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/db6184f355c7f4e3b876d0f228c2fcfc\"},\"breadcrumb\":{\"@id\":\"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jamesonquave.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Swift 3 Tutorial &#8211; Fundamentals\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/#website\",\"url\":\"https:\/\/jamesonquave.com\/blog\/\",\"name\":\"Jameson Quave\",\"description\":\"Using computer technology to educate, and improve lives.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jamesonquave.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/db6184f355c7f4e3b876d0f228c2fcfc\",\"name\":\"Jameson Quave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d9786c83345117d560bbeab0e1f26814?s=96&d=retro&r=pg\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d9786c83345117d560bbeab0e1f26814?s=96&d=retro&r=pg\",\"caption\":\"Jameson Quave\"},\"sameAs\":[\"http:\/\/jamesonquave.com\"],\"url\":\"https:\/\/jamesonquave.com\/blog\/author\/jquave\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Swift 3 Tutorial - Fundamentals - Jameson Quave","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/","og_locale":"en_US","og_type":"article","og_title":"Swift 3 Tutorial - Fundamentals - Jameson Quave","og_description":"Swift 3 Tutorial In this Swift 3 tutorial, we&#8217;ll focus on how beginners may approach going from complete beginner to having a basic grasp on Swift, and we&#8217;ll be working with Swift 3. We chose to write this tutorial because newcomers will find many tutorials out there that are out of date, so it&#8217;s not...","og_url":"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/","og_site_name":"Jameson Quave","article_published_time":"2016-11-22T02:58:00+00:00","article_modified_time":"2016-12-05T02:34:14+00:00","og_image":[{"url":"http:\/\/i2.wp.com\/tctechcrunch2011.files.wordpress.com\/2014\/06\/img_0256.jpg?w=584&ssl=1"}],"author":"Jameson Quave","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jameson Quave","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/","url":"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/","name":"Swift 3 Tutorial - Fundamentals - Jameson Quave","isPartOf":{"@id":"https:\/\/jamesonquave.com\/blog\/#website"},"datePublished":"2016-11-22T02:58:00+00:00","dateModified":"2016-12-05T02:34:14+00:00","author":{"@id":"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/db6184f355c7f4e3b876d0f228c2fcfc"},"breadcrumb":{"@id":"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jamesonquave.com\/blog\/swift-3-tutorial-fundamentals\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jamesonquave.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Swift 3 Tutorial &#8211; Fundamentals"}]},{"@type":"WebSite","@id":"https:\/\/jamesonquave.com\/blog\/#website","url":"https:\/\/jamesonquave.com\/blog\/","name":"Jameson Quave","description":"Using computer technology to educate, and improve lives.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jamesonquave.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/db6184f355c7f4e3b876d0f228c2fcfc","name":"Jameson Quave","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d9786c83345117d560bbeab0e1f26814?s=96&d=retro&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d9786c83345117d560bbeab0e1f26814?s=96&d=retro&r=pg","caption":"Jameson Quave"},"sameAs":["http:\/\/jamesonquave.com"],"url":"https:\/\/jamesonquave.com\/blog\/author\/jquave\/"}]}},"_links":{"self":[{"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/posts\/2138"}],"collection":[{"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/comments?post=2138"}],"version-history":[{"count":6,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/posts\/2138\/revisions"}],"predecessor-version":[{"id":2203,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/posts\/2138\/revisions\/2203"}],"wp:attachment":[{"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/media?parent=2138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/categories?post=2138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/tags?post=2138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}