UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

How can you return two or more values from a function?

Paul Hudson    @twostraws   

Updated for Xcode 15

Swift’s functions have a single return type, such as Int or String, but that doesn’t mean we can only return a single value. In fact, there are two ways we can send back multiple pieces of data:

  • Using a tuple, such as (name: String, age: Int)
  • Using some sort of collection, such as an array or a dictionary.

If you had a hard time understanding why tuples were important, this is a really good example of a place where they really stand out.

If we wanted to make a function that returns a person’s first name and last name, we could do it like this:

func getUser() -> [String] {
    ["Taylor", "Swift"]
}

let user = getUser()
print(user[0])

That sends back an array containing two strings and stores it in user, which does the job. However, the code is problematic for two reasons:

  1. Some cultures write their last names first (“Swift Taylor”), so it’s possible other developers might expect index 0 to be the last name and index 1 to be the first name.
  2. What if we inserted a middle name? It would push “Swift” back from index 1 to index 2, causing problems.

A second pass at the function might look like this:

func getUser() -> [String: String] {
    ["first": "Taylor", "last": "Swift"]
}

let user = getUser()
print(user["first"])

That’s definitely better, because now we can be sure exactly where to find each value: user["first"] will always be “Taylor” no matter whether we change the dictionary order or if we insert a middle name.

However, this solution still isn’t ideal:

  1. We’re need to look for values using strings, which means user["First"] will fail because we wrote “First” rather than “first”.
  2. Our dictionary might contain neither value – maybe our user was Prince, Plato, Beyonce, or someone else who goes by only one name.
  3. Every time we read a value from the dictionary we need to unwrap the optional, because Swift can’t be sure the value is definitely there.

Tuples can solve the problem by letting us be specific about what data will come back: its name, its type, its order, and whether it’s optional or not. This means we can write functions to return multiple values much more safely:

func getUser() -> (first: String, last: String) {
    (first: "Taylor", last: "Swift")
}

let user = getUser()
print(user.first)

Now we’ve written code that is immune to all our problems:

  1. Our data must be returned first name first and last name second.
  2. If we insert a middle name it will not affect the position of other values.
  3. We can’t make case-sensitive mistakes while reading values.
  4. There's no way we won’t get back a first name or last name – if someone only uses one name then we’ll get back an empty string.
  5. There is no optionality.

So, tuples make fantastic candidates for returning multiple values from functions.

BUILD THE ULTIMATE PORTFOLIO APP Most Swift tutorials help you solve one specific problem, but in my Ultimate Portfolio App series I show you how to get all the best practices into a single app: architecture, testing, performance, accessibility, localization, project organization, and so much more, all while building a SwiftUI app that works on iOS, macOS and watchOS.

Get it on Hacking with Swift+

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!

Average rating: 4.6/5

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.