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

时间:2016-02-05 08:41:28

标签: swift forced-unwrapping

我正在努力学习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的原理,但是我尝试过的任何东西都不会编译,或者如果它编译了,那么当代码启动时它会因上面的错误而失败(当按下按钮时启动代码)。

感谢您提前获取任何帮助!

4 个答案:

答案 0 :(得分:1)

有几点想法:

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

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

    enter image description here

    如果连接正确,您会在左边缘看到一个填充点:

    enter image description here

  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

答案 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.textInt(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
}