当前位置: 首页 > 知识库问答 >
问题:

初始化结构的实例并获取未解析的标识符错误

濮阳鸿祯
2023-03-14

我想在我的TableViewController中初始化一个名为TaskList的结构实例,但是我在每次使用“任务”的地方都遇到“使用未解析标识符“任务”错误。当我在类中声明var任务时,它运行良好,但是现在它是在另一个. swift文件中声明的var的初始化,我收到了这个错误。我刚刚在学习Swift,所以我怀疑这与架构有关,或者搞砸了如何从另一个文件调用对象。有人知道我需要做什么来修复它吗?非常感谢任何帮助!谢谢大家!

下面是 UITable 视图控制器代码:

import UIKit

class LoLFirstTableViewController: UITableViewController {

    //var tasks:[Task] = taskData
    // Hashed out the above line (even though it worked) because replacing with
    // the below line because trying to get instance of TaskList containing all
    // properties instead of just the tasks as well as to allow multiple instances
    // of TaskList

    let exampleList = TaskList(buddy: exampleBuddy, phoneNumber: examplePhoneNumber, tasks: exampleTaskData)

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 60.0
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tasks.count
    }

    @IBAction func cancelToLoLFirstTableViewController(_ segue:UIStoryboardSegue) {
    }

    @IBAction func saveAddTask(_ segue:UIStoryboardSegue) {
        if let AddTaskTableViewController = segue.source as? AddTaskTableViewController {

            if let task = AddTaskTableViewController.task {
                tasks.append(task)

                let indexPath = IndexPath(row: tasks.count-1, section: 0)
                tableView.insertRows(at: [indexPath], with: .automatic)
            }
        }
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) as! TaskCell
        let task = tasks[indexPath.row]
            cell.task = task

        if cell.accessoryView == nil {
            let cb = CheckButton()
            cb.addTarget(self, action: #selector(buttonTapped(_:forEvent:)), for: .touchUpInside)
            cell.accessoryView = cb
        }
        let cb = cell.accessoryView as! CheckButton
        cb.check(tasks[indexPath.row].completed)

        return cell
    }

    func buttonTapped(_ target:UIButton, forEvent event: UIEvent) {
        guard let touch = event.allTouches?.first else { return }
        let point = touch.location(in: self.tableView)
        let indexPath = self.tableView.indexPathForRow(at: point)

        var tappedItem = tasks[indexPath!.row] as Task
        tappedItem.completed = !tappedItem.completed
        tasks[indexPath!.row] = tappedItem

        tableView.reloadRows(at: [indexPath!], with: UITableViewRowAnimation.none)
    }
}

如果有帮助的话,下面是TaskList结构的代码:

import UIKit

struct TaskList {
    var buddy: String?
    var phoneNumber: String?
    var tasks: [Task]

    init(buddy: String?, phoneNumber: String?, tasks: [Task]) {
        self.buddy = buddy
        self.phoneNumber = phoneNumber
        self.tasks = tasks
    }
}

共有1个答案

松景铄
2023-03-14

在结构中,任务数组不是可选的,这意味着您必须传递一个初始化的任务数组。传递一个初始化的数组或将任务数组更改为可选数组,就像您对buddy和phoneNumber所做的那样。

import UIKit

struct TaskList {
var buddy: String?
var phoneNumber: String?
// add a question mark to make your array of tasks optional
var tasks: [Task]?

init(buddy: String?, phoneNumber: String?, tasks: [Task]) {
    self.buddy = buddy
    self.phoneNumber = phoneNumber
    self.tasks = tasks
  }
}

注意:当您使用struct时,您可以省略初始化程序,它会自动生成一个

import UIKit

struct TaskList {
   var buddy: String?
   var phoneNumber: String?
   var tasks: [Task]?
}

现在在您的视图中控制器初始化您的示例列表

// as your tasks array is optional now even if you pass in a nil it will not crash but it will not have a tasks array
let exampleList = TaskList(buddy: exampleBuddy, phoneNumber: examplePhoneNumber, tasks: exampleTaskData)

请记住在使用数组之前先将其展开,否则如果任务数组为零,应用程序可能会再次崩溃。出租或保护时使用

if let tasks = exampleList.tasks {
   // now you can use your tasks array
}
 类似资料:
  • 本文向大家介绍实例解析Java中的构造器初始化,包括了实例解析Java中的构造器初始化的使用技巧和注意事项,需要的朋友参考一下 1.初始化顺序   当Java创建一个对象时,系统先为该对象的所有实例属性分配内存(前提是该类已经被加载过了),接着程序开始对这些实例属性执行初始化,其初始化顺序是:先执行初始化块或声明属性时制定的初始值,再执行构造器里制定的初始值。 在类的内部,变量定义的先后顺序决定了

  • 本文向大家介绍tensorflow 初始化未初始化的变量实例,包括了tensorflow 初始化未初始化的变量实例的使用技巧和注意事项,需要的朋友参考一下 今日在Stack Overflow上看到一个问如何只初始化未初始化的变量,有人提供了一个函数,特地粘贴过来共大家品鉴: 通过tf.global_variables()返回一个全局变量的列表global_vars, 然后以python列表解析式的

  • 我正在为StandardAlone java类编写一个Junit测试用例。我在初始化Class对象时获取nullPointerException。这是我的代码。非常感谢任何帮助 这是我的课

  • 问题内容: 当我尝试获取懒惰的初始化实体时,我在IDE中看到以下异常消息(我无法找到它在代理实体中的存储位置,因此无法为该异常提供整个堆栈跟踪): 这是我尝试访问要使用的惰性初始化实体的字段后得到的堆栈跟踪: 我正在使用Spring Data,已配置JpaTransactionManager,数据库是MySql,ORM提供程序是Hibernate4。注释@EnableTransactionMana

  • 问题内容: 我刚刚将Xcode更新为6.3版本。 除了我必须进行的所有修复(主要是)外,我还有一些警告刚刚出现(这很奇怪,因为它声明自iOS 8.0以来)。 我的密码 现在显示警告 好吧,那么我会改变的 现在我得到一个错误,说: 我感到困惑,有人可以向我解释什么地方出了问题以及如何解决? 问题答案: 使用。NSCalendar是一个本机的Objective-C框架,错误消息并不迅速。

  • 我有一个非常简单的项目。它是使用Xcode 8.0在Swift 3.0上编写的命令行工具。这个程序是: 这工作得很好,并在控制台中打印“a”,但让我们做这个程序更复杂: 和线 被标记为错误 使用未解析的标识符“b” 我们可以让事情变得更简单: 再一次,线 被标记为错误 未解析标识符“a”的使用 我不是新手,我明白我可以很容易地修复这个错误,就像把所有变量放在程序的开头一样。问题是:为什么会发生这种