检查字典中的对象是否为Int(Swift)

时间:2016-07-20 17:51:20

标签: ios swift dictionary

我对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]类型,但这没有影响。

我被困住了,你的任何想法都会受到赞赏。如果有更多细节有帮助,请告诉我。谢谢!

2 个答案:

答案 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语句会失败,我们会安全地继续前进。