我编写了一些代码,用于从自定义对象数组中查找用户的收藏夹。它工作得非常好,除非该对象不存在,在这种情况下它只是崩溃。我正在考虑以不同的方式完全重写代码,但我想可能有办法解决它...我只是无法弄清楚如何。
这是我的代码:
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中的字符串,它可以正常工作,但如果没有它会崩溃。
任何人都可以建议我可以做出哪些改变来阻止崩溃,并让它返回nil?
谢谢!
答案 0 :(得分:3)
您可以在已过滤的数组上使用first
属性:
return result.first
返回一个可选项。但是,更好的选择是使用indexOf()
函数(如果你在Swift 2中),因为它不构建整个数组,并且一旦找到你的内容就停止查看rideArray的其余部分正在寻找:
return self.rideArray.indexOf { $0.name == name }.map { self.rideArray[$0] }
答案 1 :(得分:2)
您需要检查result
的长度 - 您可以通过替换
return result[0]
与
return result.count == 0 ? nil : result[0]