我正在努力学习Swift,并且它与其他语言的差异远远超出我的预期......
我只想将用户输入的值存储为变量中的整数。
我的尝试导致以下错误: "致命错误:在展开可选值"
时意外发现nil我尝试了多种方法,似乎无法提出解决方案,我知道必须有一种简单的方法来实现这一目标。
var intNumber: Int = 0
@IBOutlet weak var txt_Number: UITextField!
for view in self.view.subviews as [UIView]{
if let txt = view as? UITextField
{
if let txtData = txt.text where txtData.isEmpty
{
// Error Message
}
else
{
intNumber = Int(txt_Number.text)
}
}
}
我知道上面的代码是不正确的,但我认为我最接近正确的代码。在展开的过程中,我似乎错过了一些东西。我理解unwrapping的原理,但是我尝试过的任何东西都不会编译,或者如果它编译了,那么当代码启动时它会因上面的错误而失败(当按下按钮时启动代码)。
感谢您提前获取任何帮助!
答案 0 :(得分:1)
有几点想法:
确保您的插座连接到txt_Number
。如果(a)它是您在IB中连接的出口,则所有这些代码检查以确保它不是nil
。 (b)在视图完全加载之前,您没有执行上述代码(即调用了viewDidLoad
)。
如果插座未连接,您会在左边缘看到一个空白点:
如果连接正确,您会在左边缘看到一个填充点:
如果所有内容都正确连接,您可以这样做:
guard let txtData = txt_Number.text, let value = Int(txtData) else {
// report error and then `return`
return
}
intNumber = value
如果您想获得想象力,您可能希望确保用户只能通过
输入数值在viewDidLoad
中,指定键盘仅用于十进制数字。
txt_Number.keyboardType = .NumberPad
或者您也可以在IB中指定。
指定文本字段的委托,仅允许它们输入数值。 (根据先前的观点,这似乎是多余的,但事实并非如此,因为您还必须预期它们将字符串粘贴到文本字段。)
答案 1 :(得分:1)
对于初学者,如果您有直接引用subviews
,则不必迭代txt_Number
,但这不是您问题的本质。
if let
语义将允许您解开{}
括号内的任何可选项,因此这里最明显的解决方案是:
if let unwrappedString = txt_Number.text {
if let unwrappedIntegerInit = Int(unwrappedString) {
intNumber = unwrappedIntegerInit
}
}
我在游乐场的完整示例:
var intNumber: Int = 0
var txt_Number: UITextField = UITextField()
txt_Number.text = "12"
if let unwrappedString = txt_Number.text {
if let unwrappedIntegerInit = Int(unwrappedString) {
intNumber = unwrappedIntegerInit
}
}
print(intNumber)
或者你可以在一个函数中使用guard:
func parse() {
guard let text = txt_Number.text, let number = Int(text) else { return } // no text
intNumber = number
}
提示强>
您必须单独解开txt_Number.text
和Int(text)
,因为Int(text)
必须具有非可选参数。
答案 2 :(得分:0)
你试过这个吗?
if let txtData = txt.text where !txtData.isEmpty
{
intNumber = Int(txtData)
}
else
{
// Error Message
}
添加强>:
Int()
函数返回Optional
。如果您确定该值是正确的,则可以使用变量名末尾的!
强制解包(当您使用它时),否则只需添加问号?
答案 3 :(得分:0)
尝试下面的代码将TextField的值赋给float类型的变量,所有的bug都像魔术一样消失
@IBOutlet weak var txtamount: UITextField!
@IBOutlet weak var txtrate: UITextField!
@IBOutlet weak var txtyear: UITextField!
@IBOutlet weak var lblresult: UILabel!
@IBAction func btncalculate(_ sender: UIButton)
{
print("button is clicked")
var amount,rate,year,answer : Float
amount = Float(txtamount.text!)!
rate = Float(txtrate.text!)!
year = Float(txtyear.text!)!
answer = (amount * rate * year) / 100.0
}