4

我正在尝试学习 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)
    }
}
}

我知道上面的代码不正确,但我认为这是最接近正确的我来了。就展开而言,我似乎遗漏了一些东西。我了解展开的原理,但是我尝试过的任何内容都不会编译,或者如果它确实编译了,那么它会在启动代码时失败并出现上述错误(按下按钮时会启动代码)。

提前感谢您的帮助!

4

4 回答 4

4

几个想法:

  1. 确保您的插座连接到txt_Number. nil如果(a)它是您在 IB 中连接的一个出口,则所有这些代码检查以确保它不是必需的;viewDidLoad(b) 在视图完全加载(即被调用)之前,您没有执行上述代码。

    如果插座未连接,您会在左边距看到一个空点:

    在此处输入图像描述

    如果连接正确,您会在左边距看到一个实心点:

    在此处输入图像描述

  2. 如果一切都正确连接,你可以这样做:

    guard let txtData = txt_Number.text, let value = Int(txtData) else {
        // report error and then `return`
        return
    }
    
    intNumber = value
    
  3. 如果你想变得花哨,你可能想确保用户只输入数字值

    • viewDidLoad中,指定键盘仅用于十进制数字。

      txt_Number.keyboardType = .NumberPad
      

      或者你也可以在 IB 中指定。

    • 为文本字段指定一个委托,并且只允许他们输入数值。(根据前面的观点,这似乎是多余的,但事实并非如此,因为您还必须预料到它们会将字符串粘贴到文本字段中。)

    请参阅https://stackoverflow.com/a/26940387/1271826

于 2016-02-05T08:50:46.120 回答
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.textInt(text)单独导致Int(text)必须具有非可选参数。

于 2016-02-05T09:07:11.693 回答
0

你试过这个吗?

if let txtData = txt.text where !txtData.isEmpty
{
    intNumber = Int(txtData)
}
else
{
    // Error Message
}

添加

Int()函数返回一个Optional. 如果您确定该值是正确的,您可以通过!在变量名末尾使用(当您使用它时)强制展开,否则只需加上问号?

于 2016-02-05T08:45:15.183 回答
0

尝试下面的代码将 TextField 的值分配给 float 类型的变量,所有错误都像魔术一样消失

@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
}
于 2016-11-01T13:38:35.690 回答