setValuesForKeysWithDictionary для managedObject выдает ошибку компиляции в swift

Я пробую основанное на данных приложение в swift, в котором я выполняю следующие шаги:

  1. Получить данные из списка
  2. Итерация по полученным данным
  3. Во время каждой итерации вставляйте управляемый объект в управляемый объект
  4. Установить значения во вставленном управляемом объекте из словаря

Ниже приведен код, который я использую:

 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 ответ

Когда вы пытаетесь получить значение из словаря, это может означать, что для данного ключа не существует никакого значения. Поэтому в swift вы получаете не значение, а значение, заключенное в тип параметра. Сообщение об ошибке в основном говорит, что "атрибуты" - это AnyObject, заключенный в Option, а не значение типа AnyObject. Другими словами, сообщение об ошибке означает, что вы должны проверить, действительно ли значение существует, прежде чем использовать его, потому что в противном случае ваше приложение может вылетать. Самый простой способ развернуть тип - написать "атрибуты!" Вот. Но вы действительно должны прочитать о типах опций, потому что это очень простая концепция в Swift:

Опциональное сцепление в Swift

Другие вопросы по тегам