对象内容与方法内容不同

时间:2018-03-06 12:32:04

标签: swift xcode

我正在使用正在构建的应用程序遇到一种奇怪的行为。

我有一个结构Record,我从NavigationViewController的子ViewController创建它的一个实例。

我们可以这样看:

NavigationController(名为TaskTabsController)
|
ViewController(称为TaskFromController)

如果我设置断点,我可以检查并检查对象的内容是否应该是什么(符合接口输入数据)。

但是当我在该实例(下一行)上调用方法时,不同的成员具有不同或缺少的值。

对象实例是在TaskTabsController中创建的,具体如下:

if let formVC = (viewControllers?[1] as? TaskFormViewController) {
  let rec: TaskRecord? = formVC.makeTaskRecord()
  // here the rec data are correct when I inspect the instance

  rec?.prepareData()
  // from the prepareData function, the properties are different of can't be accessed...
}

Ex:从控制器,我可以看到我的实例rec有一个成员task实例(Task类型)且name属性。
但是在prepareData方法中,task成员无法显示附加到其上的名称。 (调试器说价值不可读或类似的东西)
此外,我可以看到其他对象的列表,但在该方法中,它们的计数是不同的......

以下是makeTaskRecord方法的工作原理:(来自我的TaskFormViewController)

在TaskFormFiewController中,我有一个像这样的私有属性:

private var stepsSelected: [StepRecord] = []

该属性通过用户操作进行更新 StepRecord是一个结构。 (所以我认为应该通过价值传递)

接下来是同一个控制器中的makeTaskRecord方法(从表单元素中收集详细信息)

func makeTaskRecord() -> TaskRecord? {

    guard let current_task = task
        else {
            print("TaskForm.makeTaskRecord(): Can't create a record without a Task")
            return nil
    }

    // check data validity
    var errors:[String] = []

    // generate StepRecords >>>
    if stepsSelected.count == 0 {
        errors.append("Error, no step selected")
    }
    // <<<

    // DATA OK
    if errors.isEmpty {
        let taskrecord = TaskRecord(
            id: record?.id,
            taskId: task!.id,
            userCode: Config.getUser()!.code, // global object containing login state
            pictures: [],
            memo: memo.text,
            task: current_task,
            stepRecords: stepsSelected // data here is correctly set
        )

        return taskrecord // but here, I can't retreive the stepRecords! (1)
    }
    else {
        // display errors in an alert box
        let errorVC = MyHelpers.makeAlert("Error with data", errors.joined(separator: "\n"))
        self.present(errorVC, animated: true)
        return nil
    }
}

这是prepareData()方法的样子:( Record类的方法)

func prepareData() -> [String: Any]? {
    // no steps in record, data is invalid
    guard
        let stepRecordsJson = try? JSONEncoder().encode(self.stepRecords)
        // This is where I constated that stepRecords is different (set but empty)
    else {
        return nil
    }

    // other data
    var params = [
        "task_id": taskId,
        "user_code": userCode,
        "step_records": stepRecordsJson,  // this is what doesn't work well, but it's certainly related to (1) above
        "memo": memo ?? ""
    ] as [String : Any]

    // when editing, we set again the record ID
    if let edit_id = self.id {
        params["id"] = edit_id
    }

    return params
}

注意:所有数据结构和Codable struct

在上面的例子中,在(1)处,我在返回线上放了一个断点 检查数据时,我发现“子结构”没有好的值:

(lldb) print current_task.name
(String) $R0 = "屋根工事"
(lldb) print taskrecord.task.name
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x6f).
The process has been returned to the state before expression evaluation.

task是一个结构,所以不应该有问题,但调试器无法读取我分配给我的taskrecord的任务。

我有什么遗失的吗?就像某种指针引用一样?

0 个答案:

没有答案