2015-09-17 17 views
0

在我斯威夫特类我有以下几点:斯威夫特:如何转换可选(“可选(STR)”)为Int

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 
    } 

,可在任务类的某些属性自选(如ID)和所以他们可能是零。 当我需要执行任务更新操作时,我需要从cellData中检索数据,创建一个任务对象并使用它来更新需要一个id的数据库。所以这是我做的:

var taskToUpdate = Task(id: self.cellData["id"]!.toInt(), 
         ...) 

的问题是,ID总是设置为零。我曾尝试:

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

和我所得到的是这样的:

Optional("Optional(102)"). 

这是将其转换诠释了正确的方法是什么?

+0

'toInt()'本身返回一个可选项,所以你必须强制解包到底。 – Sulthan

+0

@Sulthan:我已经尝试了self.cellData [“id”] !. toInt()!但我得到“致命的错误:意外地发现零,而解包可选值”,虽然println(self.cellData [“ID”]!)显示可选(54)...我不明白,真的:( –

回答

1

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

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

以其它方式使用可选的绑定

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

我有尝试了你写的东西,以及我在两条指令中得到的零...也许它是stringInterpolationSegment,它使事情出错,Task类具有其他属性,这些属性是Int?但只有id XCode希望我放入stringInterpolationSegment。 .. –

+0

实际上,你应该使用'Int(....)'而不是'toInt()'。解决所有问题的最佳解决方案是使用自定义结构/类而不是字典。必须通过名称访问属性,你将不会有可选项。 – Sulthan

+0

我已经尝试用self.cellData [“id”] !. toInt()!但我得到“致命错误:意外地发现零,而解包可选值”,虽然println(self.cellData [“id”]!)显示可选(54)...我不明白,真的:( –

1

你有两个问题有:

  1. .toInt()返回可选。
  2. self.detailItem!.id中的id也可能是可选的。

结果是一个可选的id与价值102转换为"Optional(102)"而不是"102"如你所愿。

我会建议你一个简单的解决方案 - 不要使用字典来保存你的数据,使用对象的属性有正确的类型。不要将你的数字转换成字符串,并返回。否则,你将不得不强制展开,例如:

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

是的,id在self.detailItem !.id也是可选的,因为一个新创建的任务没有一个id(这将由数据库给出),所以是零,而我已经存在的任务修改了一个id ...这就是为什么我虽然要声明id作为Int?....你知道我能如何解决我的问题吗?也许声明id为一个简单的Int? –

+1

@LoryLory有很多解决方案。你可以使用'0'作为默认ID。或者只是检查'id'不是'nil'。问题不是'id'是'nil'。问题是你正在将它转换为字符串并且不正确地返回到整数并且是不必要的。 – Sulthan

+1

考虑重新设计模型,例如使用非可选的'id'并将0赋值为“空”id。 – vadian