我已经创建了一个类:
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
答案 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]
属性一无所知。
根据你想要完成的事情,你可以做两件事之一
AnyObject
而不是AnyObject
。Task
投射到(task[0] as! Task).name
。 prepareForDeletion