【问题标题】:UITextField to Int to UILabelUITextField 到 Int 到 UILabel
【发布时间】:2017-08-15 23:51:09
【问题描述】:

我习惯了 C# 和 java,swift 绝对是一个不同的野兽!

我已经努力了好几个小时试图让它发挥作用。这也是如此简单的事情!我只想从 UITextField 中获取文本并将其转换为 Int,然后将 Int 发送到 UILabel!!

网上这么多答案根本没用!

这是我现在遇到的错误。 (使用 Xcode 8.2.1 和 Swift 3.0.2

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var firstTextField: UITextField!
    @IBOutlet weak var secondTextField: UITextField!
    @IBOutlet weak var sumLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func calculateButton(_ sender: UIButton) {
        let firstNumber = Int(firstTextField.text!)
        let secondNumber = Int(secondTextField.text!)

        //ERROR: 'init' has been renamed to 'init'(describing:)'
        sumLabel.text = String(firstNumber + secondNumber)
    }

}

谢谢大家!

【问题讨论】:

标签: swift string int uitextfield uilabel


【解决方案1】:

由于第二个实例需要一个字符串,因此您可以简单地将代码设为:

@IBAction func calculateButton(_ sender: UIButton) {
    sumLabel.text = firstTextField.text!
}

但是如果你先做一些计算,然后有这样的代码:

@IBAction func calculateButton(_ sender: UIButton) {
    let firstNumber = Int(firstTextField.text!)
    sumLabel.text = "\(firstNumber)"
}

在值之前用 \ 将值放在括号中的部分称为字符串插值。您可以将StringIntDoubleDate 等大多数基本类型的值转换为String

如果你想防止 Int 强制转换不起作用,可能是因为文本中有非数字字符,你可以这样做或类似的事情:

@IBAction func calculateButton(_ sender: UIButton) {
    if let firstNumber = Int(firstTextField.text!) {
        sumLabel.text = "\(firstNumber)"
    }
}

否则,字符串插值会给你类似"Optional(125)"

如果文本字段没有任何文本,您也会在 firstTextField.text! 上崩溃 :) 所以您可能需要进一步细化为这样的内容:

@IBAction func calculateButton(_ sender: UIButton) {
    if let txt = firstTextField.text {
        if let firstNumber = Int(txt) {
            sumLabel.text = "\(firstNumber)"
        }
    }
}

这样,您可以确保在进入下一个阶段之前在每个阶段都有一个价值,而不是盲目地假设会有一个价值:)

最后,如果您没有在情节提要中连接文本字段,您可能会在运行时遇到另一次崩溃。您可以通过检查文本字段是否不为零来防止这种情况,如下所示:

@IBAction func calculateButton(_ sender: UIButton) {
    if let fld = firstTextField {
        if let txt = fld.text {
            if let firstNumber = Int(txt) {
                sumLabel.text = "\(firstNumber)"
            }
        }
    }
}

【讨论】:

  • 我当然希望能够用整数进行计算 :) 我只是这样写它以使其更快理解。我会编辑它:P
  • 抱歉,当您写评论时,我正在编辑以解释这一点 - 我认为您确实想在我第二次查看后进行一些计算 :)
  • 我遇到了一个致命错误:在展开可选值时意外发现 nil
  • @Merlin 在哪一行?
  • 如果让 text = firstTextField.text,
【解决方案2】:

首先获取Int

let firstNumber = Int(firstTextField.text!) ?? 0

当文本无法解析为Int 时,?? 0 提供默认值。

转换回String 很简单:

sumLabel.text = String(firstNumber)

但是,如果您想获得分组分隔符,您可能希望使用 NumberFormatter

【讨论】:

  • 如果参数不是可选的,则无需使用describing:
  • 我在这条线上仍然遇到错误:let firstNumber = Int(firstTextField.text!) ?? 0
【解决方案3】:

问题是firstNumber 是可选的并且没有可选的Int 的String init 函数。您必须先解包,然后代码才能编译。我还建议不要强制解开 text 属性。

@IBAction func calculateButton(_ sender: UIButton) {
    if let text = firstTextField.text,
      let firstNumber = Int(text) {
        sumLabel.text = String(firstNumber)
    }
}

【讨论】:

  • 我遇到了一个致命错误:在展开可选值时意外发现 nil
  • 你的 firstTextField 和你的 sumLabel 连接了吗?
【解决方案4】:

原来,我的 ViewController 失去了与两个 TextField 的连接。我只需要转到情节提要,选择 ViewController 并单击并将连接检查器中的插座拖到我的代码中。不知何故,我认为@IBOutlet 连接!谢谢

最后,您的所有答案现在都有效!显示有多少种不同的方式来做同样的事情!吓人

【讨论】:

  • 这不是您发布的实际问题的答案。
  • 是的:/哎呀!哈哈
  • @Merlin 我认为您创建了一个新答案而不是回复我:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多