swift 元素为空

swift element is empty

我试图从我的核心数据中获取第一个或当前的练习,但 swift 一直告诉我该元素为空。当我 运行 应用程序并设置断点时,调试器显示该元素为空但没有错误。这是我用来获取元素数据的函数。

func currentWorkout() -> Workout? {
    let client = currentClient()
    return (appointment?.workouts as? Set<Workout>)?.first(where: { [=11=].client == client })
}

private func currentCard() -> Card? {
    return currentWorkout()?.card
}

private func currentClientPlannedExercises() -> [ExerciseInfo] {
    if let currentCard = currentCard(), let template = currentCard.template, let exerciseSets = template.exerciseSets?.array as? [ExerciseSet] {
        let numCardsWithThis = (template.cardsWithThisTemplate as? Set<Card>)?.filter { [=11=].client != currentClient() }.count ?? 0
        let exercsiseSetNumber = numCardsWithThis % exerciseSets.count
        if let result = exerciseSets[exercsiseSetNumber].exercises?.array as? [ExerciseInfo] {
            return result
        }
    }
    return [ExerciseInfo]()
}

private func currentExercise() -> Exercise? {
    // we can't have an exercise without a selection
    guard let selectedExercise = currentExerciseInfo(), let currentCard = currentCard() else{
        return nil
    }
    // get the first exercise on the current card that has the same exercise info as the one selected
    if let exercises = currentWorkout()?.exercises as? Set<Exercise>{
        return exercises.first(where: { [=11=].exerciseInfo == selectedExercise })
    }
    let exercise = Exercise(context: context)
    exercise.workout = currentWorkout()
    exercise.exerciseInfo = selectedExercise
    //TODO: Set Seat
    return exercise
}
private func currentExerciseInfo() -> ExerciseInfo? {
    guard let selectedRow = exercisesTableView.indexPathForSelectedRow else {
        return nil
    }
    return currentClientPlannedExercises()[selectedRow.row]
}

如果问题正在获取,那么您可以使用此代码:

Core Data

获取数据
    var tasks: [Task] = [] //Your Entity Name in Bracket

    func getData() {
  do {
    tasks = try context.fetch(Task.fetchRequest()) //Instead of Task your Entity Name
    } catch {
      print("Fetching Failed")
    }
  }

并像这样使用它:

for data in tasks{
        print(data.name) // All the Attributes name after data.attributename
        print(data.address)
    }

如果在tableView中:

let data = tasks[indexPath.row]
 print(data.name)

如果数据存在,您将获得数据。

编辑以检查是否输入了数据

像这样打印路径:

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])

转到sqlite文件并打开并检查其中是否有数据。

编辑如果您在将数据添加到核心数据中遇到问题

添加数据的简单代码

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let task = Task(context: context) //Entity Name here instead of Task
task.name = taskTextField.text! // Attribute name here after task.attributename

// Save the data to coredata
(UIApplication.shared.delegate as! AppDelegate).saveContext()

希望对您有所帮助。

我发现问题出在 currentExercise 函数中,它在进行练习之前不会调用第一个练习。我通过重写函数

来修复
private func currentExercise() -> Exercise? {
    // we can't have an exercise without a selection
    guard let selectedExercise = currentExerciseInfo() else{
        return nil
    }
    // get the first exercise on the current card that has the same exercise info as the one selected
    if let exercises = currentWorkout()?.exercises as? Set<Exercise>, let firstExercise = exercises.first(where: { [=10=].exerciseInfo == selectedExercise }) {
        return firstExercise
    }
    let exercise = Exercise(context: context)
    exercise.workout = currentWorkout()
    exercise.exerciseInfo = selectedExercise
    //TODO: Set Seat
    return exercise
}