无法将字符串转换为Int

时间:2017-01-18 23:41:39

标签: swift

以下适用于Playground:

func stringToInt(numberStr: String!) -> Int {
    print(numberStr)
    return Int(numberStr)!
}

let strNum1: String?
strNum1 = "1"

let result = stringToInt(numberStr: strNum1)

按预期返回1.

在Xcode中,类似的方法失败了:

func stringToInt(numberStr: String!) -> Int {

    print("\(numberStr!)")
    let str = "\(numberStr!)"
    print(Int(str))

    return Int(str)!
}

第一次印刷产生:可选(1) 第二次印刷产生:零 return语句失败,因为它试图从nil创建一个Int。

它必须是简单的东西,但我无法确定它为什么不起作用。这是在Swift 3和Xcode 8 BTW中。

@Hamish:

在Xcode中,我有一个带数值的字符串。这样:

print(“number:(selectedAlertNumber) - unit:(selectedAlertUnit)”)

...产生这个:

号码:可选(1) - 单位:天

然后,我正在检查是否选择了selectAlertNumber ofSelecterAlertUnit!=“ - ”

                    if selectedAlertNumber != "-" && selectedAlertUnit != "-" {
                        // set alert text
                        var unitStr = selectedAlertUnit
                        let alertNumber = stringToInt(numberStr: selectedAlertNumber)
                        if alertNumber > 1 {
                            unitStr.append("s")
                        }
                        let alertText = "...\(selectedAlertNumber) \(unitStr) before event."
                        alertTimeCell.setAlertText(alertText: alertText)


                        // set alert date/time
                    }

let alertNumber = stringToInt ...行是我调用函数的方式。我可以尝试转换那里,但我想通过将转换包装在它自己的函数中来隔离问题。

1 个答案:

答案 0 :(得分:1)

通常不建议使用字符串插值将值转换为字符串,因为输出可能会因值的可选状态而异。例如,考虑以下两个函数:

func stringToInt(numberStr: String!) -> Int
{
    print("\(numberStr!)")
    let str = "\(numberStr!)"
    return Int(str)!
}

func otherStringToInt(numberStr: String!) -> Int
{
    print(numberStr)
    let str = "\(numberStr)"
    return Int(str)!
}

当使用字符串插值从!获取String类型值时,这两者之间的唯一区别是第二个函数中的numberStr。更具体地说,与函数2相比,在函数1的同一行,字符串值是非常不同的,具体取决于插值是否是可选的:

let str1: String = "1"
let str2: String! = "1"
let str3: String? = "1"

let otherStr1 = "\(str1)"  // value: "1"
let otherStr2 = "\(str2)"  // value: "Optional(1)"
let otherStr3 = "\(str2!)" // value: "1"
let otherStr4 = "\(str3)"  // value: "Optional(1)"
let otherStr5 = "\(str3!)" // value: "1"

otherStr2otherStr4传递到Int初始值设定项将产生nil,因为字符串"Optional(1)"无法转换为Int。此外,这将在力展开期间导致错误。不要在函数中使用字符串插值,最好直接使用该值,因为它已经是String

func stringToInt(numberStr: String!) -> Int
{
    return Int(numberStr)!
}

如果这是有道理的,请告诉我。

另外,我个人的反馈意见:注意力量如此频繁地解开。在许多情况下,您在解开nil可选项时可能会遇到错误的风险。