Предотвратить сбой путем кодирования - PullRequest
0 голосов
/ 20 мая 2018

У меня проблема с двумя кодами.Оба кода приводят к одному и тому же результату, когда он получил неправильные данные или данные равны нулю, происходит сбой приложения.Я пробовал несколько вещей, как "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"
    }

Спасибо

1 Ответ

0 голосов
/ 20 мая 2018

Если я правильно понимаю код, вы пытаетесь вернуть только первый элемент массива, заключенный в новый массив.Это кажется неправильным само по себе.Если вы хотите вернуть только один элемент, почему бы не вернуть один элемент?Но на вопрос о том, как избежать сбоев, вам нужно проверить пустой результат.

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

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