2015-07-15 1 views
1

Я написал код, чтобы найти избранные пользователем из массива настраиваемых объектов. Он работает абсолютно нормально, если этот объект не существует, и в этом случае он просто падает. Я рассматривал возможность полностью переписать код по-другому, но я полагаю, что есть, вероятно, способ исправить это ... Я просто не могу понять, как это сделать.Сбой фильтра объекта, если результатов не найдено

Вот мой код:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("rideCell", forIndexPath: indexPath) as! RideCell 

    var ride = DataManager.sharedInstance.getRideByName(favouritesArray[indexPath.row] as! String) 

    if ride != nil { 
     cell.rideNameLabel.text = ride!.name 

     var dateFormat = NSDateFormatter() 
     dateFormat.dateFormat = "h:mm a" 
     cell.updatedLabel.text = dateFormat.stringFromDate(ride!.updated!) 

     if ride!.waitTime! == "Closed" { 
      cell.waitTimeLabel.text = ride!.waitTime! 
     } else { 
      cell.waitTimeLabel.text = "\(ride!.waitTime!)m" 
     } 
    } 

    return cell 
} 

func getRideByName(name: String) -> Ride? { 
    let result = self.rideArray.filter({ 
     $0.name == name 
    }) 
    return result[0] 
} 

Как я уже сказал, он отлично работает, если строки в favouritesArray можно найти, однако он выходит из строя, если нет.

Может ли кто-нибудь предложить, какие изменения я могу сделать, чтобы остановить крушение, и просто получить его, чтобы вернуть нуль?

Спасибо!

ответ

2

Вы должны проверить длину result «s - вы можете сделать это путем замены

return result[0] 

с

return result.count == 0 ? nil : result[0] 
+1

'return result.first' будет самым быстрым способом :) – Qbyte

3

Вы можете использовать first свойство на отфильтрованного массива:

return result.first 

, который возвращает необязательный. Однако лучшим вариантом является использование функции indexOf() (если вы находитесь в Swift 2), так как она не создает целый массив и перестает просматривать оставшуюся часть rideArray, как только она находит то, что вы ищете :

return self.rideArray.indexOf { $0.name == name }.map { self.rideArray[$0] }