如果let-toInt不起作用,如何在Swift 2,Xcode 7 beta中将可选文本输入转换为Int

时间:2015-08-21 23:02:30

标签: xcode swift

我无法将可选输入字符串转换为Int,以便对其进行计算。

let odoField = UITextField() // allows entry of text to iOS field
odoField.text = "12500" // simulated input
let odoString = odoField.text

// now here is where I get trouble...

if let odoInt = odoString.toInt() {
    distance = Double(odoInt)
}

显然,toInt后缀不再是Swift的一部分。我尝试过以下方法:

if let odoInt = Int(odoString)() {

但后来我收到错误“可选类型字符串?未解包”并提出建议!或?,如:

if let odoInt = Int(odoString!)() {

然后我仍然得到关于展开的欧元,建议我添加另一个!,然后当我这样做时,另一个错误,我摆脱了parens,像这样:

if let odoInt = Int(odoString!)! {

然后我得到另一个错误“条件绑定的初始化程序必须具有可选类型,而不是'Int'。”

我正在尝试创建条件展开。

帮助!

4 个答案:

答案 0 :(得分:2)

首先要理解的是UITextField.text返回可选字符串,因此在您的代码中,odoString的类型为String?。另外,请注意Int构造函数需要String,而不是String?,因此您必须先打开String?才能使用它。如果!Int(odoString!),只需在变量后加odoString(如nil所示)就会导致应用崩溃。更好的是这样的:

if let s = odoString, odoInt = Int(s) {
    // odoInt is of type Int. It is guaranteed to have a value in this block
}

答案 1 :(得分:1)

我已经测试了Daniel T的答案,但它确实有效。

我有一种情况,我希望将文本字段的结果作为可选的Int返回。您可以使用以下代码扩展它以覆盖您的案例:

**TypeError: Cannot read property 'indexOf' of undefined**

 if (attribute.attributeId == 'created_on_attr' || attribute.attributeId == 'modified_on_attr' || 
      attribute.attributeId == 'created_by_attr' || attribute.attributeId == 'modified_by_attr' ){
           alert(attribute.attributeId.indexOf("fileUpload")!= -1);
           attribute.isEnabled = false;
 }

答案 2 :(得分:0)

另一个选择 - 对于更紧凑的解决方案 - 是使用flatMap:

let number = odoString.flatMap { Double($0) } ?? 0.0

答案 3 :(得分:0)

事实上,似乎Swift 2(Xcode 7 beta 6)中的答案比上面的任何内容都简单。当我这样做时,代码不会阻塞odoString的nil值。以下内容:

if let odoInt = Int(odoString!) {
    distance = Double(odoInt)
}
因此,我推测,除非有更深入的知识,否则编译器会将此视为"如果语句为True(右侧有效),则定义并初始化变量,然后继续执行。 "我欢迎进一步的反馈。这确实不需要上面提出的许多额外代码。