将文本字段值分配给 Swift 中的变量

Assigning text field value to variable in Swift

我正在努力学习 Swift,结果发现它与其他语言的差异超出了我的预期...

我只想将用户输入的值作为整数存储在变量中。

我的尝试导致以下错误: "fatal error: unexpectedly found nil while unwrapping an Optional value"

我已经尝试了多种方法,但似乎无法提出解决方案,我知道必须有一个简单的方法来做到这一点。

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)
    }
}
}

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

在此先感谢您的帮助!

你试过这个吗?

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

添加:

Int() 函数 returns 和 Optional。如果你确定这个值是正确的,你可以通过在变量名的末尾使用!强制解包(当你使用它时),否则就把问号?

几个想法:

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

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

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

  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 中指定。

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

    参见 。

对于初学者,如果您有直接参考 txt_Number,则不必遍历 subviews,但这不是您问题的本质。

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) 必须有非可选参数。

尝试使用下面的代码将 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
}