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)!
}