Swift3 通过编码防止崩溃

Swift3 通过编码防止崩溃,swift3,crash,plist,Swift3,Crash,Plist,我有两个代码的问题。这两个代码的结果相同,当它收到错误的数据或数据为零时,应用程序崩溃。我确实尝试了一些“do{}catch{”之类的方法,但没有效果。我也无法预测用户输入的错误条目 下面是其中一个代码的示例: override func viewDidLoad() { super.viewDidLoad() let array = getSwiftArrayFromPlist(name: "LongRange") let nam

我有两个代码的问题。这两个代码的结果相同,当它收到错误的数据或数据为零时,应用程序崩溃。我确实尝试了一些“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: $0)}[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: $0)}[0]] //<- Error appear here!!!! "Thread 1: Fatal error: Index out of range"
    }
override func viewDidLoad(){
super.viewDidLoad()
让数组=getSwiftArrayFromPlist(名称:“远程”)
让namePredicate=NSPredicate(格式:“高度=%@”,TextField.text!)
让Coordinate=NSString(格式:“%@,[array.filter{namePredicate.evaluate(with:$0)}[0]])作为字符串?
}  
func getSwiftArrayFromPlist(名称:字符串)->(数组){
让path=Bundle.main.path(forResource:name,类型为“plist”)
var arr:NSArray?
arr=NSArray(contentsOfFile:path!)
返回(arr as?数组)!
} 
func getDataforFuelConsumption(数据:字符串)->(数组){
让数组=getSwiftArrayFromPlist(名称:“远程”)
让namePredicate=NSPredicate(格式:“高度=%@”,数据)

返回[array.filter{namePredicate.evaluate(with:$0)}[0]]//如果我正确理解了代码,那么您试图只返回数组的第一个元素,并将其包装在一个新数组中。这本身似乎是错误的。如果您只想返回一个元素,为什么不返回一个元素呢?但对于如何避免崩溃的问题,您需要检查是否有空结果

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

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

我建议您首先设置一个异常断点:在Xcode中,打开左侧窗格中的断点导航器,点击底部的+按钮,然后选择exception breakpoint。当您执行代码时,它将在崩溃之前停止,并可能会向您显示原因。基于此原因,我确实知道原因。用户尝试重试的信息e、 在播放列表文件中不存在。它运行良好,非常感谢。对于数组的评论,您有一个非常好的观点。我将检查它。