Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将字符串转换为Int时出现问题_Swift - Fatal编程技术网

Swift 将字符串转换为Int时出现问题

Swift 将字符串转换为Int时出现问题,swift,Swift,在游乐场进行以下工作: 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: Str

在游乐场进行以下工作:

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中

@哈米什语:

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

打印(“编号:(selectedAlertNumber)-单位:(selectedAlertUnit)”)

…产生了以下结果:

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

然后,我检查selectedAlertNumber of selecterAlertUnit!=“——”


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

通常不建议使用字符串插值将值转换为字符串,因为根据值的可选状态,输出可能会有所不同。例如,考虑这两个函数:

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)!
}
这两者之间的唯一区别是
numberStr
获取
string
类型值时,第二个函数中的code>。更具体地说,与函数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"
otherStr2
otherStr4
传递到
Int
初始值设定项将产生nil,因为字符串
“可选(1)”
不能转换为
Int
。此外,这将在强制展开过程中导致错误。与其在函数中使用字符串插值,不如直接使用该值,因为它已经是
字符串

func stringToInt(numberStr: String!) -> Int
{
    return Int(numberStr)!
}
让我知道这是否有意义


另外,我个人的反馈是:小心如此频繁的强制展开。在许多情况下,在打开一个nil可选文件时,您可能会遇到错误。

忘记添加,在Xcode块上转换Int(numberStr)(如在操场上)也会失败;当我发布示例时,我正在尝试一种不同的方法。我无法重现这种情况–您如何调用
stringToInt
?A会很有帮助的。作为补充说明,您不应该将
numberStr
注释为IUO–它作为非可选参数会更安全。@Hamish:更新了我的原始帖子,以显示我如何调用该函数。好的,那么问题就在您的代码后面
selectedAlertNumber
是字符串
“可选(1)”
。如何分配它?
selectedAlertNumber=“\(itemToEdit?.alarmNumber)”
是问题所在
itemToEdit?.alarmNumber
是一个可选选项,在应用字符串插值之前,需要先将其展开(虽然它回避了一个问题,即
alarmNumber
是否是一个数字,但为什么您要将其转换为字符串,然后稍后再转换为
Int
?为什么
selectedAlertNumber
不是一个
Int
开头?)谢谢您,Michael,是的,这很有意义。
func stringToInt(numberStr: String!) -> Int
{
    return Int(numberStr)!
}