我有两个代码的问题。这两个代码最终得到相同的结果,当它收到错误的数据或数据为零时,应用程序崩溃。我确实尝试了一些事情" 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"
}
谢谢
答案 0 :(得分:1)
如果我正确理解了代码,那么您只是尝试返回数组的第一个元素,并将其包装在一个新数组中。这本身似乎是错误的。如果您只想返回一个元素,为什么不返回一个元素?但是对于如何避免崩溃的问题,你需要检查一个空的结果。
let namePredicate = NSPredicate(format: "altitude = %@", data)
let results = array.filter {namePredicate.evaluate(with: $0)}
if let firstResult = results.first {
return [firstResult]
} else {
return []
}