以下适用于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 ...行是我调用函数的方式。我可以尝试转换那里,但我想通过将转换包装在它自己的函数中来隔离问题。
答案 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"
将otherStr2
或otherStr4
传递到Int
初始值设定项将产生nil,因为字符串"Optional(1)"
无法转换为Int
。此外,这将在力展开期间导致错误。不要在函数中使用字符串插值,最好直接使用该值,因为它已经是String
。
func stringToInt(numberStr: String!) -> Int
{
return Int(numberStr)!
}
如果这是有道理的,请告诉我。
另外,我个人的反馈意见:注意力量如此频繁地解开。在许多情况下,您在解开nil可选项时可能会遇到错误的风险。