我无法将可选输入字符串转换为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!)() {
然后我仍然得到关于展开的欧元,建议我添加另一个!,然后当我这样做时,另一个错误,我摆脱了parens,像这样:
if let odoInt = Int(odoString!)! {
然后我得到另一个错误“条件绑定的初始化程序必须具有可选类型,而不是'Int'。”
我正在尝试创建条件展开。
帮助!
答案 0 :(得分:2)
首先要理解的是UITextField.text返回可选字符串,因此在您的代码中,odoString
的类型为String?
。另外,请注意Int
构造函数需要String
,而不是String?
,因此您必须先打开String?
才能使用它。如果!
为Int(odoString!)
,只需在变量后加odoString
(如nil
所示)就会导致应用崩溃。更好的是这样的:
if let s = odoString, odoInt = Int(s) {
// odoInt is of type Int. It is guaranteed to have a value in this block
}
答案 1 :(得分:1)
我已经测试了Daniel T的答案,但它确实有效。
我有一种情况,我希望将文本字段的结果作为可选的Int返回。您可以使用以下代码扩展它以覆盖您的案例:
**TypeError: Cannot read property 'indexOf' of undefined**
if (attribute.attributeId == 'created_on_attr' || attribute.attributeId == 'modified_on_attr' ||
attribute.attributeId == 'created_by_attr' || attribute.attributeId == 'modified_by_attr' ){
alert(attribute.attributeId.indexOf("fileUpload")!= -1);
attribute.isEnabled = false;
}
答案 2 :(得分:0)
另一个选择 - 对于更紧凑的解决方案 - 是使用flatMap:
let number = odoString.flatMap { Double($0) } ?? 0.0
答案 3 :(得分:0)
事实上,似乎Swift 2(Xcode 7 beta 6)中的答案比上面的任何内容都简单。当我这样做时,代码不会阻塞odoString的nil值。以下内容:
if let odoInt = Int(odoString!) {
distance = Double(odoInt)
}
因此,我推测,除非有更深入的知识,否则编译器会将此视为"如果语句为True(右侧有效),则定义并初始化变量,然后继续执行。 "我欢迎进一步的反馈。这确实不需要上面提出的许多额外代码。