Jan Mark Dannenberg
Jan Mark Dannenberg

Reputation: 703

Using Do/Catch in Swift

I am working on an app and want to get data back from a function. However sometimes data is missing or is different from the kind of that I want to retrieve. I am new to Swift and I can't find a way to write a function that does a little bit of processing and returns this data. When this data is missing, the function should give back a string "Not Found". Like this:

func processData(data:String) {
    do {
        //processing
        var result = processedData
    } catch {
        var result = "Not Found"
    }

    return result
}

It would be very nice if somebody could help me.

Upvotes: 4

Views: 4461

Answers (5)

glyvox
glyvox

Reputation: 58129

You should check if the result is nil.

func processData(data: String?) -> String {
    guard let result = data else {
        return "Not Found"
    }

    return result
}

Upvotes: 4

Ulug'bek
Ulug'bek

Reputation: 2832

Those answer were written till mine are right. There is one way: with handler check get result and use by your point.

enum Errors: Error {
  case noData
  case unknownError
}

func progress(data: String?, completionHandler: @escaping (_ result: String? , _ error: Error?) -> Void ) {

  guard let data = data else {
    // Data is missing
    throw nil, Errors.noData
  }

  // Do other things, and throw if necessary

  result = data

  return result, nil
}

// example of calling this function 
process(data: "A data to process"){(result, error) -> Void in 
     //do any stuff
     /*if error == nil {
     }*/
}

Upvotes: 1

Furqan Khan
Furqan Khan

Reputation: 505

The most concise way of doing it would be using the guard-let construct:

func processData(data: String?) -> String {
    // Assuming getProcessedData(:) returns your processed data
    guard let result = getProcessedData(data) else {
        return "Not found"
    }
    return result
}

Also, your function is missing a return type. You must specify the return type like -> TYPE in all functions that return some value.

Upvotes: 1

Magnas
Magnas

Reputation: 4063

Your function needs to be explicit about returning something with e.g. -> String Also do-catch is for methods that can throw an error. It seems like you need to take a look at how to use optionals. Optionals can have a value or they can have no value.

fun processData(data: String) -> String {
   var result: String?
   // Do some processing and assign the result to result variable

  guard let result = result else { return "Not Found" }

  return result
}

Upvotes: 0

Dean
Dean

Reputation: 1542

A good practice in swift would be to use correctly the throws errors

This is an example inspired from yours :

enum Errors: Error {
  case noData
  case unknownError
}

func progress(data: String?) throws -> String {

  guard let data = data else {
    // Data is missing
    throw Errors.noData
  }

  // Do other things, and throw if necessary

  result = data

  return result
}

do {
  try process(data: "A data to process")
} catch {
  print("An error occurred: \(error)")
}

You can try this code as is in a Swift Playgound

Upvotes: 0

Related Questions