Swift:如何将Optional(" Optional(str)")转换为Int

时间:2015-09-17 10:24:27

标签: swift casting optional

在我的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的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

函数toInt()总是返回一个可选项,因为只有少数情况下字符串可以转换为整数。如果您可以确保该值永远不为零,请将其解包

println(self.cellData["id"]!.toInt()!)

否则使用可选绑定

If let idInt = self.cellData["id"]!.toInt() { println(idInt) }

答案 1 :(得分:1)

你有两个问题:

  1. .toInt()会返回一个可选项。
  2. id中的self.detailItem!.id也可能是可选的。
  3. 结果是,值id的可选102转换为"Optional(102)",而不是"102"

    我建议你一个简单的解决方案 - 不要使用字典来保存数据,使用属性具有正确类型的对象。不要四处转换你的数字到字符串和返回。否则你将不得不在任何地方展开力量,例如:

    String(stringInterpolationSegment: self.detailItem!.id!)