string - 处理来自Swift 2.0 String对象函数的错误

标签 string error-handling swift2

我是Swift 2.0编程的新手(来自C# Realm ),我只是想编写一个函数来分析字符串中的某些数据并返回结果。该函数本身运行良好,但是作为该过程的一部分,如果输入字符串的格式不正确,则字符串函数可能会抛出错误,并且我想为该函数准备一个包罗万象的错误处理程序。这是没有错误处理的原始函数的代码:

// Parses the numeric value of the BATT return string
private func parseBatteeryLevel(inputStr : String) -> Int {
    if inputStr.hasPrefix("BATT") && inputStr.containsString("%") {
        let start = inputStr.startIndex.advancedBy(5)
        let end = inputStr.characters.indexOf("%")?.advancedBy(-1)

        if end != nil {
            return Int(inputStr.substringWithRange(start...end!))!
        }else{
            return 0
        }
    }else{
        printStatus("Return Value Parse Error: \"\(inputStr)\"")
        return 0
    }
}

如您所见,我确实对可以输入的字符串实现了基本的健全性检查,但这绝不是好办法。我主要担心的是,如果通过了检查,但是导致advanceBy()或任何内部字符串函数失败,会发生什么?

我确实尝试将代码包装在如下所示的do-catch块中,
private func parseBatteeryLevel(inputStr : String) -> Int {
    if inputStr.hasPrefix("BATT") && inputStr.containsString(" ") {
        do {
            let start = try inputStr.startIndex.advancedBy(5)
            let end = try inputStr.characters.indexOf("%")?.advancedBy(-1)

            if end != nil {
                return try Int(inputStr.substringWithRange(start...end!))!
            }else{
                return 0
            }
        } catch let error as NSError {
            printStatus(error.description)
        }
    }else{
        printStatus("Return Value Parse Error: \"\(inputStr)\"")
        return 0
    }
}

但是然后我在do块内所有行旁边收到警告,并用try关键字标记为:

No calls to throwing functions occur within 'try' expression



然后,在catch关键字旁边还有一个警告说:

'catch' block is unreachable because no errors are thrown in 'do' block



这没有任何意义,因为如果输入了无效的字符串,该函数显然会使程序崩溃。在C#中处理起来很简单,但是在Swift 2.0中处理此问题的正确方法是什么?

最佳答案

因此问题字符串startIndex和character函数不会引发,而swift可以捕获的异常将尝试catch块。有关更多信息,请参见The Swift Programming Language (Swift 2.1) - Error Handling文档。

所以我重写了代码以处理整数解析而不会崩溃

func parseBatteeryLevel(inputStr : String) -> Int {
    if inputStr.hasPrefix("BATT") && inputStr.containsString("%") {
        let start = inputStr.startIndex.advancedBy(5)
        let indexOfPercent = inputStr.characters.indexOf("%")

        if (indexOfPercent != nil) {
            let end = indexOfPercent!.advancedBy(-1)
            let batteryLevel = inputStr.substringWithRange(start...end)

            if let level = Int(batteryLevel) {
                return level
            }
        }

        return 0

    } else {
        print("Return Value Parse Error: \"\(inputStr)\"")
        return 0
    }
}

关于string - 处理来自Swift 2.0 String对象函数的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33350758/

相关文章:

mysql - MySQL 查询中的日期/字符串差异

arrays - kql - 如何从字符串数组中删除所有空字符串?

python-2.7 - Python “expected an indented block”

javascript - domain.dispose() 在 nodejs 中到底做了什么?有钩子(Hook)吗?

ios - 单击另一个按钮 swift 2.2 更改声音按钮图像

php - preg_match 捕获特殊字符后的字符串部分

c# - 如何构建像 SO 这样的标记系统?

php - Ausart 主题选项。我已经安装了一个主题,但我现在有这个错误 :

ios - 登录后如何使用 FBSDKLoginKit 注销?

ios - writetofile 总是返回 false