检查字典中的对象是不是为 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)的主要内容,如果未能解决你的问题,请参考以下文章