2015-04-10 5 views
1

Необходимо получить доступ к записям Core Data с помощью Swift.Получение атрибутов для ManagedObjects

В идеале я хочу назвать класс «Основные данные», который возвращает ManagedObject или false (объект не существует). Однако в настоящее время, когда я хочу, чтобы извлечь атрибуты на ManagedObject я получаю ошибку компилятора [NSManagedObject] не имеет элемент с именем «valueForKey»

Я знаю подобных вопросов (например, swift optional chaining with cast), но я не смог для решения этой проблемы. Нужна помощь :)

Для устранения неполадок Я пытаюсь получить доступ к атрибутам уже в классе (это будет сделано за пределами класса позже). Код ниже. Почему я получаю ошибку компилятора и как ее исправить?

Спасибо!

class CoreData{ 

    // Fetch existing data (from Core Data) 
    func getData(entity: String) -> AnyObject { 

     // Set delegate 
     let appDelegate = 
     UIApplication.sharedApplication().delegate as AppDelegate 

     let managedContext = appDelegate.managedObjectContext! 

     // Get entity = a table (filter) 
     let fetchRequest = NSFetchRequest(entityName:entity) 

     // Create error variable 
     var error: NSError? 

     // Get record 
     let fetchedResults = 
     managedContext.executeFetchRequest(fetchRequest, 
     error: &error) as [NSManagedObject]? 

     if let results = fetchedResults { 
      // Data retrieved 
      var temp = results.valueForKey("gender") as String // <-- ERROR 
      println(temp) 
      return results 
     } else { 
      // Could not obtain data - log it 
      println("Could not fetch \(error), \(error!.userInfo)") 
      return false 
     } 
    } 
} 

ответ

2

NSArray имеет метод valueForKey, но Swift массивы не делают. У вас есть следующие варианты:

  • Преобразовать массив Swift в NSArray:

    var temp = (results as NSArray).valueForKey("gender") as! String 
    
  • Использование map() на Swift массив и valueForKey для каждого объекта:

    var temp = map(results) { $0.valueForKey("gender") as! String } 
    
  • (Рекомендуется) Позволяет Xcode создавать NSManagedObject подкласс для вашего лица и использовать map() с аксессорах собственности:

    var temp = map(results) { $0.gender } 
    

(Приведенный выше пример кода для текущего Xcode 6.3/Swift 1.2, в более ранних версии вы должны использовать as вместо as!.)

в качестве альтернативы, вы можете создать запрос выборки с .DictionaryResultType для извлечения только некоторые выбранные атрибуты, см Fetching selected attribute in entities для примера.

+0

Martin R - вы - мужчина! В настоящее время, просматривая опцию подкласса - кажется, лучше, чем лучше - спасибо за указание! Вопрос из любопытства в отношении подхода к словарю: если вы запрашиваете несколько атрибутов, а один (или несколько) не существует - будет ли сбой сбоя вместе - или привести атрибуты, которые существуют? ** Еще раз спасибо - сделал мой день - желаю вам отличных выходных! ** –

+0

@PederWessel: Добро пожаловать! - Если 'propertiesToFetch' содержит любые свойства, которые не являются действительными свойствами объекта, запрос на выборку не будет выполнен. –

+0

Спасибо Мартин. Наслаждайся выходными –

Смежные вопросы