无法访问数组内的对象(Swift)

时间:2016-01-26 22:44:54

标签: ios arrays swift object

我已经创建了一个类:

 class Task {
        var name:String
        var description:String
        var date:NSDate
        var taskCompleted:Bool

        init(name:String, description:String,date:NSDate, taskCompleted:Bool){
            self.name = name
            self.description = description
            self.date = date
            self.taskCompleted = taskCompleted
        }
    }
然后我创建一个新对象:

let newTask:AnyObject = Task(name: taskName.text!, description: descriptionInput.text, date: datePicker.date, taskCompleted: false)

稍后我将对象添加到数组中:

var tasks = [AnyObject]()
tasks.append(newTask)

但是,当我尝试再次访问该对象时,我收到错误:

print(tasks[0].name)

错误:在解包可选值时意外发现nil

3 个答案:

答案 0 :(得分:2)

在您当前的代码tasks[0]中,AnyObject类型没有“name”属性。尝试更改:

print(tasks[0].name)

print((tasks[0] as! Task).name)

要将tasks[0]AnyObject更改为Task

答案 1 :(得分:2)

您的数组类型为[AnyObject]。如果您想避免使用关键字,则应将其设为[Task],因为AnyObject不一定具有name属性。这就是为什么在展开Optional值时大喊大叫nil的原因。

试试这个:

let newTask:Task = Task(name: taskName.text!, description: descriptionInput.text, date: datePicker.date, taskCompleted: false)

var tasks = [Task]()
tasks.append(newTask)

print(tasks[0].name)

就像Lindsey所说的那样,如果你想要有不同类型的对象,你可以使用as关键字,但我认为这不是你想要的。

答案 2 :(得分:2)

目前,当您从阵列中访问任务时,您会收到AnyObject,该name对您的[Task]属性一无所知。

根据你想要完成的事情,你可以做两件事之一

  1. 您可以将数组设置为AnyObject而不是AnyObject
  2. 从数组中检索时,将Task投射到(task[0] as! Task).nameprepareForDeletion