[英]How do you convert optional text input to Int in Swift 2, Xcode 7 beta using if let - toInt does not work
我在将可选输入String转换为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!)() {
但是然后我仍然得到有关解包的欧元,建议我再添加一个!,然后在执行此操作时,我摆脱了括号的另一个错误,如下所示:
if let odoInt = Int(odoString!)! {
然后出现另一个错误,“用于条件绑定的初始化程序必须具有可选类型,而不是'Int'。”
我正在尝试在此处创建条件展开。
救命!
首先要了解的是,UITextField.text返回一个可选字符串,因此在您的代码中, odoString
是String?
类型的String?
。 另外,请记住, Int
构造函数采用String
而不是String?
所以你必须解开String?
才能使用它。 只是放一个!
如果odoString
为nil
则该变量(如Int(odoString!)
)之后将使您的应用程序崩溃。 更好的是这样的:
if let s = odoString, odoInt = Int(s) {
// odoInt is of type Int. It is guaranteed to have a value in this block
}
我已经测试了Daniel T的答案,并且有效。
我有一种情况,我想将文本字段的结果作为可选的Int返回。 您可以使用以下代码将其扩展为涵盖您的情况:
let odoInt = odoField.text != nil ? Int(odoField.text!) : nil
if let odoInt = odoInt {
// Use unwrapped odoInt here
}
对于更紧凑的解决方案,另一种选择是使用flatMap:
let number = odoString.flatMap { Double($0) } ?? 0.0
实际上,看来Swift 2(Xcode 7 beta 6)的答案比上面的答案要简单。 当执行以下操作时,代码不会阻塞odoString的nil值:
if let odoInt = Int(odoString!) {
distance = Double(odoInt)
}
因此,我推测,除非有更深的了解,否则编译器确实将其视为“如果语句为True(右侧有效),则定义并初始化变量,然后继续执行”。 我欢迎进一步的反馈。 这确实不必要了上面建议的许多额外代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.