我对iOS编码相对较新,并没有完全围绕可选项,向下转换,词典和相关的有趣概念。我非常感谢以下方面的帮助。
我正在从数据库下载数据,并希望对数据执行检查以避免崩溃。在这种特殊情况下,我想在执行任务以避免崩溃之前检查字典中的Object是否为Int。
//The downloaded dictionary includes Int, Double and String data
var dictionaryDownloaded:[NSDictionary] = [NSDictionary]()
//Other code for downloading the data into the dictionary not shown.
for index in 1...dictionaryDownloaded.count {
let jsonDictionary:NSDictionary = self.dictionaryDownloaded[index]
if (jsonDictionary["SUNDAY OPEN TIME"] as? [Int]) != nil {
self.currentlyConstructingRecommendation.sundayOpenTime = jsonDictionary["SUNDAY OPEN TIME"] as! Int!
}
self.recommendationsArray.append(currentlyConstructingRecommendation)
}
我遵循了相关question and answer的方法。然而,问题是“if(jsonDictionary [”SUNDAY OPEN TIME“]为?[Int])!= nil”line is never true。我相信这是因为该值是一个可选对象。我尝试将字典调整为[String:AnyObject]类型,但这没有影响。
我被困住了,你的任何想法都会受到赞赏。如果有更多细节有帮助,请告诉我。谢谢!
答案 0 :(得分:3)
使用此代码:jsonDictionary["SUNDAY OPEN TIME"] as? [Int]
,您尝试将值转换为Array<Int>
,而不是Int
。
在您的代码中,您还有另一个缺陷:index in 1...dictionaryDownloaded.count
。
当index
到达dictionaryDownloaded.count
时,这会导致索引超出范围异常。
所以,快速解决方法是:
for index in 0..<dictionaryDownloaded.count {
let jsonDictionary:NSDictionary = self.dictionaryDownloaded[index]
if (jsonDictionary["SUNDAY OPEN TIME"] as? Int) != nil {
self.currentlyConstructingRecommendation.sundayOpenTime = jsonDictionary["SUNDAY OPEN TIME"] as! Int!
}
self.recommendationsArray.append(currentlyConstructingRecommendation)
}
但我建议你以更加Swifty的方式来做。
for jsonDictionary in dictionaryDownloaded {
if let sundayOpenTime = jsonDictionary["SUNDAY OPEN TIME"] as? Int {
self.currentlyConstructingRecommendation.sundayOpenTime = sundayOpenTime
}
self.recommendationsArray.append(currentlyConstructingRecommendation)
}
答案 1 :(得分:1)
我认为你把Int
(这是一个整数)与[Int]
(整数 s 的数组)混淆了。此外,代码的这一部分是多余的:
if (jsonDictionary["SUNDAY OPEN TIME"] as? [Int]) != nil {
self.currentlyConstructingRecommendation.sundayOpenTime = jsonDictionary["SUNDAY OPEN TIME"] as! Int!
}
您使用优秀的as?
运算符执行条件转换,但随后您丢弃结果并在下一行使用危险的as!
。您可以使用if let
使这更安全,更清晰:
if let sundayOpenTime = jsonDictionary["SUNDAY OPEN TIME] as? Int {
self.currentlyConstructingRecommendation.sundayOpenTime = sundayOpenTime
}
这会将类型转换为Int
,如果该结果不是nil
,则将其展开并将sundayOpenTime
设置为它。然后,我们在下一行中使用sundayOpenTime
类型Int
常量。但是,如果演员的结果是 nil
,则整个if
语句会失败,我们会安全地继续前进。