在Swift中使用Do/Catch

4

我正在开发一个应用程序,希望从一个函数中获取数据。但是有时候数据丢失或者与我想要检索的数据类型不同。我对Swift还很陌生,找不到一种方法来编写一个函数,它可以进行一些处理并返回这些数据。当这些数据丢失时,该函数应该返回一个字符串“未找到”。就像这样:

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

    return result
}

希望有人能够帮助我,这将非常好。


1
你可以使用 String? 来检查值是否为 nil。 - Jaydeep Vora
1
只是为了明确,您想强制使用错误抛出机制(这将需要使用do catch),还是简单的if-else/guard else就可以了?到目前为止,只有Dean的答案使用了do-catch机制... - mfaani
5个回答

4

您应该检查result是否为空。

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

    return result
}

3
guard-let 结构在表达式之后需要添加 else - Furqan Khan

1
最简洁的方法是使用 guard-let 结构体:
func processData(data: String?) -> String {
    // Assuming getProcessedData(:) returns your processed data
    guard let result = getProcessedData(data) else {
        return "Not found"
    }
    return result
}

此外,您的函数缺少返回类型。在所有返回某些值的函数中,您必须像-> TYPE这样指定返回类型。

我尝试了这个:func retrieveData(objectwanted:String!, data:String!, pattern:String!) -> String{ var info = (data.regex(pattern)) guard let result = info[0] else { return "未找到" } return result } - Jan Mark Dannenberg
但现在它说“条件绑定的初始化器必须具有可选类型,而不是'String'” - Jan Mark Dannenberg

1

那些答案直到我的回答才是正确的。有一种方法:使用处理程序检查结果并按照您的观点使用。

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 {
     }*/
}

0
在Swift中的一个好习惯是正确使用throws错误。
以下是一个受您启发的示例:
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)")
}

你可以在 Swift Playground 中尝试这段代码


0

你的函数需要明确指定返回值类型,例如 -> String。此外,do-catch 适用于可能会抛出错误的方法。看起来你需要了解如何使用可选项(Optionals)。可选项可以有值,也可以没有值。

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接