Запрос на выборку, возвращающий {( // значение)} вместо просто значения

#ios #swift #xcode #core-data #relationship

#iOS #swift #xcode #основные данные #связь

Вопрос:

Мне очень сложно понять, как извлекать значения отношений между объектами. У меня есть объект Food и объект Meal. В демонстрационных целях я просто перечислил по 1 атрибуту для каждого. Название для еды и белка для еды. Мои отношения — это еда и еда с обратной зависимостью, многие ко многим. Что я хочу иметь возможность сделать, так это получить блюдо и вернуть значение белка, связанное с этим блюдом. В конечном итоге я буду получать питание по дате, а затем извлекать информацию о питании из этого приема пищи. Решение, которое я нашел, возвращает больше, чем просто значение, как вы можете видеть на картинке метки симулятора. Пожалуйста, любая помощь будет очень признательна! У меня такое чувство, что есть более простой способ сделать то, что я пытаюсь сделать, но я искал часами и не могу понять это.

Я пытался публиковать изображения, но это мне не позволит, поэтому я опубликую свой код и то, что происходит.

ViewController.swift

 import UIKit
import CoreData

class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    //================================
    //CREATE MEAL AND FOOD
    //================================
    let newMeal = NSEntityDescription.insertNewObject(forEntityName: "Meal", into: context) as! Meal
    newMeal.title = "Meal 1"

    let newFood = NSEntityDescription.insertNewObject(forEntityName: "Food", into: context) as! Food
    newFood.protein = "20"
    newFood.setValue(newMeal, forKey: "meal")

    //================================
    //FETCH REQUEST
    //================================
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Meal")
    let sortDescriptor = NSSortDescriptor(key: "title", ascending: true)
    request.sortDescriptors = [sortDescriptor]
    request.returnsObjectsAsFaults = false
    do {
        //===============================
        //EXTRACT RELATIONSHIP DATA
        //==============================
        let results = try context.fetch(request) as NSArray
        for res in results {
            let data = res as! Meal
            let item = data.food
            let strs = item.value(forKey: "protein")
            self.label.text = "(strs)"
        }
    } catch {
        print ("error")
    }   
}
  

Мой ярлык отображает это…

{(
20
)}

Мне нужно просто вытащить ’20’. Пытаюсь установить значение label.text в str как! строка также не будет работать. Какие-либо рекомендации?? Большое вам спасибо

Ответ №1:

Будет ли сделано следующее?

 self.label.text = strs
  

Комментарии:

1. Можете ли вы проверить тип «элемента» при трассировке? Что это?

2. О какой переменной вы говорите?

3. Пусть элемент = данные. еда (еда — это переменная отношения между 2 объектами)

4. Проверьте тип «strs». Я думаю, это набор.

5. Вы можете проверить свою модель данных (в «Meal.h») и преобразовать «item» в строку на основе типа «food» в классе «Meal», а затем присвоить ее label.text .

Ответ №2:

Я понял это…..

 import UIKit
import CoreData

class ViewController: UIViewController {

var item:NSSet = []
var strs:NSSet = []

@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    //================================
    //CREATE MEAL AND FOOD
    //================================
    let newMeal = NSEntityDescription.insertNewObject(forEntityName: "Meal", into: context) as! Meal
    newMeal.title = "Meal 1"

    let newFood = NSEntityDescription.insertNewObject(forEntityName: "Food", into: context) as! Food
    newFood.protein = "20"
    newFood.setValue(newMeal, forKey: "meal")

    //================================
    //FETCH REQUEST
    //================================
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Meal")
    let sortDescriptor = NSSortDescriptor(key: "title", ascending: true)
    request.sortDescriptors = [sortDescriptor]
    request.returnsObjectsAsFaults = false
    do {
        //===============================
        //EXTRACT RELATIONSHIP DATA
        //==============================
        let results = try context.fetch(request) as! [Meal]
        for res in results {

            item = res.food

            strs = item.value(forKey: "protein") as! NSSet
            let array = strs.allObjects
            print(array[0])

            self.label.text = String(format: "%@", array[0] as! CVarArg)
        }
    } catch {
        print ("error")
    }   
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}
  

Спасибо за помощь