LearnUnderstanding Optionals in Swift

Amit Bijlani
writes on June 17, 2014

Share with your friends










Submit

When Apple introduced Swift they talked about three main things they set out to achieve: safe, modern and powerful. One such power feature is called optional. Most language features exist to solve a problem and naturally optional was created to solve a problem. Let’s explore an example to understand its use and purpose. Assume that you have an array containing apartment numbers that violated their rental agreement (oh yeah, they are in trouble). We need to check if an apartment number exists in that array so we can send them a notice.

let aptNumbers = ["101","202","303","404"]

We can write a very simple function to see if we can find a an apartment number within the array.

func findApt (aptNumber : String, aptNumbers: String[]) -> String {
    for tempAptNumber in aptNumbers {
        if ( tempAptNumber == aptNumber) {
            return aptNumber
        }
    }
}

The above function takes in two parameters. A string and an array of strings. The first parameter is the apartment number we are looking for and the second parameter is an array of all apartment numbers. Then within the function we iterate over our array storing each apartment number in a temporary variable called tempAptNumber. We then compare the values and if we find a match we return it. However, the above function is incomplete because we are only returning a value when one is found. What happens when we don’t find a value? We must return something. Ideally, we should return a nil but we specified String as our return type. One solution would be to return an empty string:

func findApt (aptNumber : String, aptNumbers: String[]) -> String {
    for tempAptNumber in aptNumbers {
        if ( tempAptNumber == aptNumber) {
            return aptNumber
        }
    }
    return ""
}

The above solution is a failure because we should be able to use an if statement such as:

if findApt("505", aptNumbers) {
	sendNotice()
}

However, that if statement will never get executed because it always returns a String value. Moreover, it does not evaluate to a boolean expression. We could compare against an empty string but that defeats the purpose. It would be nice to return a nil when the apartment number is not found in the array. Changing the last line to return nil will give us a compiler error because we set our return value to be a String. This is where optionals come in very handy.

An optional can have two states, a value or a nil. To declare an optional, simply suffix it with a ?. Let’s rewrite our function above to use an optional.

func findApt (aptNumber : String, aptNumbers: String[]) -> String? {
    for tempAptNumber in aptNumbers {
        if ( tempAptNumber == aptNumber) {
            return aptNumber
        }
    }
    return nil
}

Now we are well equipped to use an if statement:

let culprit = findApt("404",aptNumbers)
if culprit {
	sendNotice();
}

Instead of sending a generic notice, let’s assume we needed to use a function sendNoticeTo(apt: Int), where we are sending a notice to a specific apartment number. In that case, we cannot simply pass the constant culprit.

if culprit {
	sendNoticeTo(culprit);
}

Firstly, because culprit is a string and secondly because it is an optional. As I mentioned above that optionals can either contain a value or nil. When we created the constant culprit it was implicitly defined as an optional too since that is the return type of our function.

let culprit: String? = findApt("404",aptNumbers) // inferred type String?

It is important to understand that String and String? are not the same. The former can only contain a string whereas the later can contain either a string or a nil. So how do we convert the result of our function to the value of type String?. You can instruct the optional to provide you with a value if there is one.

let culprit = findApt("404",aptNumbers) 
if culprit {
	sendNoticeTo(culprit!) // Note the use of the ! operator to unwrap the value to String
}

We are not quite there yet because we need to send an Int to our sendNoticeTo function. Besides, we can also combine the two above statements into one:

if let culprit = findApt("404",aptNumbers) {
	sendNoticeTo(culprit.toInt())
}

When used as an if let statement the constant culprit is assigned the actual value of type String, which is the same as unwrapping the value using a bang ! operator. Now that culprit is of type String we can call the toInt() function on it. There’s still one issue we haven’t addressed. The function toInt() returns Int? which is also an optional. Now we could nest if statements.

if let culprit = findApt("404",aptNumbers) {
	if let culpritAptNumber = culprit.toInt() {
		sendNoticeTo(culpritAptNumber)
	}
}

Why nest when we can chain function calls. Swift provides what is called optional chaining to make such statements compact:

if let culpritAptNumber = findApt("404",aptNumbers)?.toInt() {
	sendNoticeTo(culpritAptNumber)
}

The above ties in very nicely because we chain the call to the function toInt by using the ? operator. Since toInt also returns an optional we can check to see if we received a valid apartment number and then call the function sendNoticeTo else nothing will happen.

Conclusion

Optionals help save a lot of time and make our code readable and efficient. It might take a little getting used to but once you get the hang of it you would hate to have code lying around that explicitly checks for nils or sentinel values.

While you are waiting for our Swift course to be available, take Amit’s current iOS Development course.

10 Responses to “Understanding Optionals in Swift”

  1. 高品質2015シャネル スーパーコピー激安專門店弊社は海外大好評を博くシャネル コピー激安老舗です,2015高品質シャネル バッグ コピー,シャネル 靴 コピー,シャネル 財布 コピー品の品質はよくて、激安の大特価でご提供します。 http://www.newkakaku.net/he.htm

  2. 財布コピー、バッグコピー、腕時計コピー、ベルトコピー靴コピーネックレスコピー、手帳コピー、小物コピー、SS品、N品、価格激安、品質の保証,2015人気ブランド偽物,歓迎光臨楽天★送料無料(日本全国)典雅気質!シャネルバッグCHH67723(*^^*)11月シャネル手作り新作(*^^*)時流の先端快適美品!シャネルブーツCH783283四季向け「 シャネル靴」最高な選択!ブランドコピー 代引きコピーブランド 代引きスーパーコピー 代引きスーパーコピーブランドバッグルイヴィトン コピーシャネル コピー http://www.gginza.com/wallet/louisvuitton/index.html

  3. スーパーコピー、スーパーコピーブランド(N級品)激安通販専門店世界一流ブランドコピー 財布、スーパーコピー 商品、激安ブランドコピー 。 ヴィトンコピー 、 ミョウミョウコピー 、シャネルコピー 、エル メスコピー 品格安通販。商品は全て最高な材料 と優れた技術で造られて、正規と比べて、品質が無差別です!人気ブランド.. http://www.bagkakaku.com/bvlgari_wallet.html

  4. BVLGARI(バッグ?財布?小物)CHLOE(バッグ?財布、小物)偽物ブランド,激安,コピー?ルイヴィトンバッグ,偽物?ルイヴィトン財布,コピーバッグ,ブランドバッグ,偽物バッグ,偽物シャネルバッグ,偽物エルメスバッグ,偽物グッチバッグ,偽物財布,コピー財布,時計の專門店 http://www.msnbrand.com/brand-copy-IP-24.html

  5. 2015年の新素材-新作!高品質 腕時計高品質の追求 超N品を良心価格で提供詳しくは以下のようなブランドがあります。HERMES(バッグ、財布、時計) CHANEL(バッグ、財布、時計)LOUIS VUITTON(バッグ、小物、財布、時計) BVLGARI(財布、時計)Christian Dior(バッグ、財布) COACH(バッグ、財布)GUCCI(バッグ、財布) ROLEX(時計)OMEGA(時計) IWC(時計)FRANCK MULLER(時計) HUBLOT(時計)クロエ CHLOE バッグなどです。ご不明点が ございましたらお気軽にお問い合わせください http://www.okakaku.com/brand-25-copy-0.html

  6. スーパーコピー腕時計,ロレックスコピー,ブライトリングコピー,ボーム&メルシエコピー時計コピー業界最高峰スーパーコピー時計通販専門!7年以上の販売実績を 持つ時計コピー老舗!時計コピーであれば何でも揃えられます コピー時計 時計スーパーコピー通販専門店!時計コピー時計販売通販! コピー時計スーパー コピー等の 最高級のレプリカコピー時計を販売ロレックスコピー,ガガミラノコピー ,IWCコピー ,オメガコピー ,フェラーリコピー ,フランクミュラーコピー ,ベル&ロスコピー ,各種のブランドはコピーを表しますコピーを表して、時計をコピーして、スーパーコピーは代 金引換払いにして、スーパーはブランドをコピーして、スー パーは時計をコピーして代金引換払いにして、スーパーは時 計をコピーして、スーパーは腕時計をコピーして、ブランド はスーパーマーケットを表してコピーして、ブランドのスー パーマーケットはコピーして、ブランドはコピーを表して、 腕時計はコピーします http://www.wtobrand.com/pr1.html

  7. 100%実物写真ですし、品質が完璧です!”スーパーコピーブランド財布激安 偽物財布激安コピー ルイヴィトン財布偽物,偽物財布コピーエルバーキンコピースーパーコピー財布ブランド財布コピーブランドコピー激安バレンシアガ スーパーコピー激安ロレックス スーパーコピー時計ブランド財布激安 偽物財布激安コピー ルイヴィトン財布偽物,偽物財布コピーブランド激安市場-jck35販売:ブランド財布コピー,激安ブランド,財布コピー,偽ブランド,偽 ブランド財布,偽物ブランド財布,ブランドコピー,ヴィトンコピー,ルイヴィトン財布偽物, シャネル財布コピー,グッチ財布コピー,エルメス財布偽物,D&G 財布コピー,ボッテガ 財布 .2013年新作スーパーコピーロレックス,スーパーコピーロレックス時計通販スーパー コピー品その他の世界一流ロレックススーパーコピー時計品を扱っています。 ホームページをクリックして商品をご覧下さい.ロレックスコピー,業界No.1人気スーパーコピーロレックス腕時計専門販売ロレックスコピー(ROLEXスーパーコピー)のロレックス レプリカ販売専門店です。すべての商品は品質2年無料保証です,ロレックス デイトジャスト 偽物,人気満点ロレックス コピーn級品新作大特集 http://www.bagkakaku.com/celine_bag.html

  8. A great explanation of optionals..

  9. Misha S on June 20, 2014 at 10:09 pm said:

    Awesome explanation, Amit! Can’t wait to see the new Swift courses on the iOS track.

  10. Excellent tutorial – the clearest one I’ve seen on optionals. I followed it along in a playground & your explanations together with the error messages in the playground have given me a much better picture of how optionals work & when they might be useful.

Leave a Reply

Want to learn more about iOS?

iOS is the operating system that powers iPhones and iPads. Learn the language, tools and frameworks to build interactive apps on the iOS platform.

Learn more