在 swiftyJSON 上使用“if let”会使我的核心数据分配出错

Posted

技术标签:

【中文标题】在 swiftyJSON 上使用“if let”会使我的核心数据分配出错【英文标题】:Using "if let" on swiftyJSON makes my coredata assignment go awry 【发布时间】:2016-07-11 16:40:52 【问题描述】:

我有一些我正在处理 swiftyJSON 的 JSON 数据。我将其放入核心数据中。如果所有字段都在那里,它可以正常工作,但有些字段是空的,我正在尝试“保护”免受空字段的影响。

如果填充了所有字段,以下是可以正常工作的代码部分:

        // Iterate through each item in the JSON 
        for (_,subJson) in readableJSON[]["data"] 
            let title = subJson["title"].string!
            let url_title = subJson["url_title"].string!
            let entry_id = subJson["entry_id"].string!


        let newPet: NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName("Pets", inManagedObjectContext: context)

        // Store the data in CoreData "Pets"
        newPet.setValue(self.title, forKey: "title")
        newPet.setValue(url_title, forKey: "url_title")
        newPet.setValue(entry_id, forKey: "entry_id")


         // end of "for items in JSON struck

但是,为了防止出现空字段,我尝试对 JSON 迭代执行此操作:

        if let entry_id = subJson["entry_id"].string 

但是当我这样做时,newPet.setValue 会抛出这个错误:

使用未解析的标识符“entry_id”

在这种情况下,我知道entry_id总是存在的,所以我很困惑。

想法?

【问题讨论】:

它存在,但不在同一个范围内(if let 创建一个新范围)。以guard let 为例。 【参考方案1】:

if let 语句仅将该变量绑定到它自己的块中:

if let entry_id = subJson["entry_id"].string 
    //entry_id exists in this block, and is non-nil

else 
    //entry_id was nil, doesn't exist


//entry_id doesn't exist anymore

如果您想为父范围绑定到该名称,请使用guard let

guard let entry_id = subJson["entry_id"].string else 
    //entry_id was nil, doesn't exist
    //you MUST break, return, or call a @noreturn function from here


//entry_id exists for the rest of this scope, and is non-nil

【讨论】:

以上是关于在 swiftyJSON 上使用“if let”会使我的核心数据分配出错的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 上迭代 JSON 数组(使用 SwiftyJson 解析)

如何理解 if let 与guard

swift中 if let 与 guard let 对比,guard会降低一个分支

Swift if let 在 Optional(nil) 上成功评估

如何在 osx 上安装 SwiftyJSON

TableView 上使用 SwiftyJSON 和 Alamofire 的 JSON 数据