Handling Errors in Swift - Swift 2.0, Xcode 7 and Interface Builder - iOS 9 Swift Programming Cookbook (2015)

iOS 9 Swift Programming Cookbook (2015)

Chapter 1. Swift 2.0, Xcode 7 and Interface Builder

In this chapter, we are going to have a look at some of the updates to Swift (Swift 2.0), Xcode, and Interface Builder. We will start with Swift and some of the really exciting features that have been added to it since you read the iOS 8 Swift Programming Cookbook.

1.1 Handling Errors in Swift

Problem

You want to know how to throw and handle exceptions in Swift.

NOTE

I’ll be using errors and exceptions interchangeably in this book. When an error occurrs in our app, we usually catch it, as you will soon see, and handle it in a way that is pleasant and understandable to the user.

Solution

To throw an exception, use the throw syntax. To catch exceptions, use the do, try, catch syntax.

Discussion

Let’s say that you want to create a method that takes in a first name and last name as two arguments and returns a full name. The first name and the last name have to each at least be 1 character long for this method to work. If one or both have 0 lengths, we are going to want to throw an exception.

The first thing that we have to do is to define our errors of type ErrorType:

enum Errors : ErrorType{

case EmptyFirstName

case EmptyLastName

}

and then we are going to define our method to take in a first and last name and join them together with a space in between:

func fullNameFromFirstName(firstName: String,

lastName: String) throws -> String{

if firstName.characters.count == 0{

throw Errors.EmptyFirstName

}

if lastName.characters.count == 0{

throw Errors.EmptyLastName

}

return firstName + " " + lastName

}

The interesting part is really how to call this method. We use the do statement like so:

do{

let fullName = try fullNameFromFirstName("Foo", lastName: "Bar")

print(fullName)

} catch {

print("An error occurred")

}

The catch clause of the do statement allows us to trap errors in a fine-grained manner. Let’s say that you want to trap errors in the Errors enum differently from instances of NSException. Separate your catch clauses like this:

do{

let fullName = try fullNameFromFirstName("Foo", lastName: "Bar")

print(fullName)

}

catch let err as Errors{

//handle this specific type of error here

print(err)

}

catch let ex as NSException{

//handle exceptions here

print(ex)

}

catch {

//otherwise, do this

}

See Also