在我的Swift课程中,我有以下内容:
var detailItem: Task?
var cellData:[String:String] = [:]
/* prepareForSegue not called before */
if (detailItem == nil) {
self.cellData = ["id":"", "titolo":"", "oggetto":"", "check_mail":"", "progetto_nome":"", "assegnato_a":"", "richiesto_da":"", "priorita":"", "termine_consegna":"", "stato":"Aperto"]
}
/* prepare for segue has been called */
else {
self.cellData["id"] = String(stringInterpolationSegment: self.detailItem!.id)
self.cellData["titolo"] = self.detailItem!.titolo
self.cellData["oggetto"] = self.detailItem!.oggetto
if (self.detailItem!.check_mail) {
self.cellData["check_mail"] = "true"
}
else {
self.cellData["check_mail"] = "false"
}
self.cellData["progetto_nome"] = self.detailItem!.progetto_nome
self.cellData["assegnato_a"] = self.detailItem!.assegnato_a
self.cellData["richiesto_da"] = self.detailItem!.richiesto_da
self.cellData["priorita"] = self.detailItem!.priorita
self.dateFormatter.dateFormat = "yyyy-MM-dd"
self.cellData["termine_consegna"] = self.dateFormatter.stringFromDate(self.detailItem!.termine_consegna)
self.cellData["stato"] = self.detailItem!.stato
var editButton:UIBarButtonItem = UIBarButtonItem(title: "Modifica", style: UIBarButtonItemStyle.Plain, target: self, action: "switchMode:")
self.navigationItem.rightBarButtonItem = editButton
}
其中Task类的某些属性是可选项(如id),因此它们可能为零。 当我需要执行任务更新操作时,我需要从cellData检索数据,创建一个任务对象并使用它来更新需要id的数据库。所以这就是我的工作:
var taskToUpdate = Task(id: self.cellData["id"]!.toInt(),
...)
问题是id始终设置为nil。我试过了:
println(self.cellData["id"]!.toInt())
我得到的是:
Optional("Optional(102)").
将其强制转换为Int的正确方法是什么?
答案 0 :(得分:1)
函数toInt()
总是返回一个可选项,因为只有少数情况下字符串可以转换为整数。如果您可以确保该值永远不为零,请将其解包
println(self.cellData["id"]!.toInt()!)
否则使用可选绑定
If let idInt = self.cellData["id"]!.toInt() { println(idInt) }
答案 1 :(得分:1)
你有两个问题:
.toInt()
会返回一个可选项。id
中的self.detailItem!.id
也可能是可选的。结果是,值id
的可选102
转换为"Optional(102)"
,而不是"102"
。
我建议你一个简单的解决方案 - 不要使用字典来保存数据,使用属性具有正确类型的对象。不要四处转换你的数字到字符串和返回。否则你将不得不在任何地方展开力量,例如:
String(stringInterpolationSegment: self.detailItem!.id!)