通过编码防止崩溃

Prevent crash by coding

我有两个代码有问题。这两个代码最终得到相同的结果,当它收到错误的数据或数据为零时,应用程序崩溃。我确实尝试了一些 "do{ }catch{" 但没有用。我也无法预测用户的错误输入。

下面是代码之一的示例:

        override func viewDidLoad() {
        super.viewDidLoad()

        let array = getSwiftArrayFromPlist(name: "LongRange")

       let namePredicate = NSPredicate(format: "altitude = %@", TextField.text!)
       let Coordinate = NSString(format:"%@",[array.filter {namePredicate.evaluate(with: [=10=])}[0]]) as String?
}  
 func getSwiftArrayFromPlist(name: String)->(Array<Dictionary<String,String>>){

        let path = Bundle.main.path(forResource: name, ofType: "plist")
        var arr : NSArray?
        arr = NSArray(contentsOfFile: path!)
        return (arr as? Array<Dictionary<String,String>>)!
    } 
    func getDataforFuelConsumption(data:String)->(Array<[String:String]>){
        let array = getSwiftArrayFromPlist(name: "LongRange")
        let namePredicate = NSPredicate(format: "altitude = %@", data)

        return [array.filter {namePredicate.evaluate(with: [=10=])}[0]] //<- Error appear here!!!! "Thread 1: Fatal error: Index out of range"
    }

谢谢

如果我对代码的理解正确,您正试图 return 只是数组的第一个元素,包装在一个新数组中。这本身似乎是错误的。如果你只想return一个元素,为什么不return一个元素呢?但是对于如何避免崩溃的问题,你需要检查一个空结果。

let namePredicate = NSPredicate(format: "altitude = %@", data)
let results = array.filter {namePredicate.evaluate(with: [=10=])}

if let firstResult = results.first {
   return [firstResult]
} else {
   return []
}