Swift 2错误处理和while循环

4
例如以下代码:
while let data = Provider.getData() {
    ...
}

使用Swift 2时会出现两个错误:
条件绑定的初始化器必须具有Optional类型,而不是'String'
调用可能抛出异常,但没有标记为'try',并且未处理错误。

在这里进行错误处理的最佳解决方案是什么…
…如果我想在此方法中处理错误。
…如果我想将错误抛出。

3个回答

6
您的getData()函数返回一个字符串值而不是可选值。因此,您应该使用?运算符将getData函数的返回类型更改为可选值类型,以便涵盖可能出现的情况。
如果您的getData函数始终返回字符串值,则while let始终期望一个可选值。在这种情况下,使用while let没有意义,因为您会有意地告诉编译器getData函数始终返回一个字符串值并尝试展开它,而我们不应该展开非可选值。
错误处理的代码(考虑到Swifter):
private func nextLine() throws -> String?{
     var returnData : String? = ""

     if arc4random_uniform(7) != 3 {
     returnData = "Genreated Random number other than 3"
     }else{
         throw NSError(domain: "Generated random number 3", code: 111, userInfo: nil)
      }
     return returnData
}

do {
     while let headerLine =  try nextLine() {
     //do something with the header
     print(headerLine)
     }
 }catch{

       //Handle exception
       print(error)
 }

nextLine函数返回一个字符串,告诉我们“生成的随机数不等于3”,如果生成的数字等于3,则它将会抛出一个异常,并且可以在catch块中处理。在这里我有可能会让nextLine函数返回一个可选值。如果我从nextLine函数的返回类型中删除问号,将导致一个错误,指出“条件值的初始化程序必须具有可选类型而不是字符串”,这意味着编译器尝试解包一个非可选值,这是毫无意义的。

考虑:

  var someIntegerValue = 5

  if let x = someIntegerValue
  {
    // it will give an error
  }

以上代码会报错,错误提示为“条件绑定的初始化器必须具有可选类型,而非Int”,因为我们在此尝试解包一个非可选值。

 If you replace var some = 5 with var some : Int? = 5 it will be all right.

错误/异常处理:

在获取值之前,您可以使用try关键字,该关键字应写在do块中,它将获取值或引发异常。异常应在catch块中处理。


0

现在getData()抛出异常,我们期望它是一个明确解包的字符串,而不是可选字符串,但是while let需要一个可选项,所以我们可以将其转换为String?

请注意,错误处理是通过将此代码包装在抛出函数中完成的。据我所知,在while let循环内部没有错误处理。

override func viewDidLoad() {
    super.viewDidLoad()

    do {
        try loop()
    } catch {
        print("some error")
    }
}

func loop() throws {
    while let data = try getData() as String? {
        print(data)
    }
}

// This is a pseudo function
func getData() throws -> String {
    if arc4random_uniform(10) != 5 {
        return "0"
    } else {
        throw NSError(domain: "d", code: 0, userInfo: nil)
    }
}

当我使用这个时,我仍然得到了第一个错误:“条件绑定的初始化器必须具有可选类型,而不是'String'”。作为解决方法,我使用 while let data try Provider.getData() as String? {…}。是否有不需要进行不必要转换的解决方案? - flashspys
你的getData()函数没有返回NSData吗? - Ian
我的getData返回一个“String”,但由于某种原因,我无法在playground中重现错误。它只存在于我的应用程序中(在多个位置)。 - flashspys
这是来自开源项目“Swifter”的代码,我正在尝试将其转换为Swift 2。原始文件。正如您所看到的,调用方法没有返回一个明确解包的字符串。这就是我想知道的事情。 - flashspys

0

当使用 while let data = ... 时,意味着 data 可能为 nil。但在您的代码中

Provider.getData()

必须返回非空值。只有在不确定是否为空时才使用“while let data = ...”这种语法。


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