Swift - выборка нескольких значений «один-много» для цикла - приведение к несвязанному типу - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь получить данные из моего отношения «один-много», однако я не могу получить доступ к их значениям, пока не приведу данные выборки к массиву.

Мои отношения таковы:

enter image description here

Я сохраняю как:

@IBAction func saveButton(_ sender: UIButton) {
    print("save")
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return
    }
    let context = appDelegate.persistentContainer.viewContext
    let workout = Workout(context: context)
    workout.name = workoutName.text
    workout.noOfSets = Int16(setsStepper.value)

    for index in 0..<setsVal {
        let sets = Sets(context: context)
        let test = IndexPath(row: index, section: 0)
        let cell = tableView.cellForRow(at: test) as! RepsTableViewCell
        sets.repAmount = Int16(cell.repsStepper.value)
        print(sets.repAmount)
        workout.addToSets(sets)
    }
    try! context.save()
}

Я получаю так:

func fetch() {
    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return
    }
    let context = appDelegate.persistentContainer.viewContext
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Workout")

    do {
        let result = try context.fetch(request)
        for index in result as! [Workout] {
            print(index.value(forKey: "name") as! String)
            print(index.value(forKey: "noOfSets") as! Int16)
            /* This line throws error */
            /* Cast from 'NSSet?' to unrelated
               type '[Sets]' alwaysfails */
            for ind in index.sets as! [Sets] {
                print(ind.repAmount)
            }
        }
    }
    catch {
        print("failed")
    }
}

Я не уверенпочему index.sets имеет тип NSSet.Сгенерированные свойства базовых данных включают:

extension Workout {

@nonobjc public class func fetchRequest() -> NSFetchRequest<Workout> {
    return NSFetchRequest<Workout>(entityName: "Workout")
}

@NSManaged public var name: String?
@NSManaged public var noOfSets: Int16
@NSManaged public var sets: NSSet?

}

// MARK: Generated accessors for sets
extension Workout {

@objc(addSetsObject:)
@NSManaged public func addToSets(_ value: Sets)

@objc(removeSetsObject:)
@NSManaged public func removeFromSets(_ value: Sets)

@objc(addSets:)
@NSManaged public func addToSets(_ values: NSSet)

@objc(removeSets:)
@NSManaged public func removeFromSets(_ values: NSSet)

}

Я не уверен, почему автоматически сгенерированные свойства базовых данных содержат типы NSSet.

Есть ли способ для меня привести индекс.sets к массиву, чтобы я мог получить доступ к отдельным значениям набора, принадлежащим указанной тренировке в предыдущем цикле for (индекс в результате)?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы можете просто использовать набор.

Если вы действительно хотите использовать вместо этого массив, попробуйте это

if let arr = index.sets?.allObjects as? [Sets]
{
   // do something here
}

Согласно документации Apple, .allObjects равен

Массив, содержащий члены набора,или пустой массив, если в наборе нет членов.

0 голосов
/ 10 декабря 2018

Я не уверен, почему index.sets имеет тип NSSet

Потому что это то, что дает вам отношение один ко многим.Это очень эффективно и мощно.Не волнуйтесь, будьте счастливы.

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

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

        /* This line throws error */
        /* Cast from 'NSSet?' to unrelated
           type '[Sets]' alwaysfails */
        for ind in index.sets as! [Sets] {

Вы не можете привести index.sets к [Sets], потому что это не то, что есть.Это Set<Sets>.

        for ind in index.sets as! Set<Sets> {

(Вы можете принудить index.sets к [Sets], но в этом нет необходимости. Просто используйте набор, которым вы являетесьНабор не имеет порядка, но вы все равно можете циклически проходить через него, получать свойства из его элементов и т. д. Если вам нужно отсортировать его, вы можете сделать это как массив, но я не вижу необходимости в этом, учитывая вашу модель.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...