托管对象上的setValuesForKeysWithDictionary在swift中提供编译错误

时间:2014-10-14 07:58:34

标签: ios swift nsmanagedobject kvc

我正在swift中尝试基于核心数据的应用程序,我正在执行这些步骤:

  1. 从plist中检索数据
  2. 迭代检索到的数据
  3. 在每次迭代期间,在managedObjectContext
  4. 中插入managedObject
  5. 从字典
  6. 中设置插入的managedObject中的值

    以下是我正在使用的代码:

     let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
            let managedObjectContext = appDelegate.managedObjectContext!
    
            // 1. Retrieve data from plist
            var defaultDataPlistPath = NSBundle.mainBundle().pathForResource("DefaultData", ofType: "plist")
            var defaultDataArray = NSArray(contentsOfFile: defaultDataPlistPath!)
    
            // 2. Store retrieved data in local db using core data apis
            for menuCategoryDict in defaultDataArray {
                // storing menu categories
                var attributes = menuCategoryDict["attributes"]
    
                var menuCategory : MenuCategories = NSEntityDescription.insertNewObjectForEntityForName("MenuCategories", inManagedObjectContext: managedObjectContext) as MenuCategories
                menuCategory.setValuesForKeysWithDictionary(attributes) // this line is giving compilation error :(
            }
    
            appDelegate.saveContext()
    

    问题 - 由于某些原因我收到编译错误:'AnyObject?'与此行的'[NSObject:AnyObject]'不同:

    menuCategory.setValuesForKeysWithDictionary(attributes)
    

    我很无能,善意地建议。

1 个答案:

答案 0 :(得分:0)

当您尝试从字典中检索值时,可能不存在给定键的值。因此,在swift中,您不会获得值,而是包含在选项类型中的值。 错误消息基本上表示"属性"是包装在Option中的AnyObject,而不是AnyObject类型的值。 换句话说,错误消息意味着您必须在使用它之前检查该值是否确实存在,否则您的应用程序可能会崩溃。 解开类型的最简单方法是编写"属性!"这里。 但是你应该真正阅读选项类型,因为它是Swift中一个非常基本的概念:

Optional Chaining in Swift