gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:28:37 27 4
gpt4 key购买 nike

我是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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com