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

Posted

技术标签:

【中文标题】检查字典中的对象是不是为 Int (Swift)【英文标题】:Check if an Object in a Dictionary is an Int (Swift)检查字典中的对象是否为 Int (Swift) 【发布时间】:2016-07-20 17:51:19 【问题描述】:

我对 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"] as?[Int]) != nil”这一行永远不会成立。我相信这是因为该值是一个可选对象。我尝试将字典调整为 [String:AnyObject] 类型,但这没有影响。

我被困住了,您的任何想法都将不胜感激。如果有更多有用的细节,请告诉我。谢谢!

【问题讨论】:

jsonDictionary["SUNDAY OPEN TIME"] 的值是多少? 应该是Int 还是[Int]?它们不是一回事,如果您的 if 语句为真,您的程序只会在下一行崩溃,因为该转换总是会失败。 尝试使用jsonDictionary["SUNDAY OPEN TIME"] as? [Int]) is[NSNull() 来检查是否为空。 它应该是一个 Int,而不是 [Int]。哇! 【参考方案1】:

使用此代码: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)

【讨论】:

啊,是的,非常感谢。像魅力一样工作。现在不考虑 [Int] 数组部分,我觉得有点傻!感谢您也获得 Swifty 的指导!【参考方案2】:

我认为您将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 设置为它。然后我们在下一行使用Int 类型的新sundayOpenTime 常量。但是,如果转换的结果nil,则整个if 语句将失败,我们安全地继续前进。

【讨论】:

啊,是的,非常感谢。奇迹般有效。现在不考虑 [Int] 数组部分我觉得有点傻!

以上是关于检查字典中的对象是不是为 Int (Swift)的主要内容,如果未能解决你的问题,请参考以下文章

将对象数组映射到 Swift 中的字典

在Swift中安全地从Int转换为Int8

在 Swift 中安全地从 Int 向下转换为 Int8

这是否可以检查swift数组中的所有值是否为真而不是逐个循环?

将 SWIFT 字典替换为 JSON 对象

检查双精度值是不是为整数 - Swift