【问题标题】:Swift 2. Trying to unwrap a label.text! with NSNumberFormatter() includedSwift 2. 试图解开 label.text!包含 NSNumberFormatter()
【发布时间】:2023-03-15 12:46:02
【问题描述】:

Swift 2. 我正在尝试使用 label.text 的答案!再次繁殖。标签是可选的,但必须与 Double 相乘。

@IBOutlet weak var testLabel: UILabel!
@IBOutlet weak var first: UITextField!
@IBOutlet weak var second: UITextField!

func calculation1() {
let dfirst = Double(first.text!)
let dsecond = Double(second.text!)
if dfirst != nil && dsecond != nil {
let answerCal = ceil(dfirst! * dsecond!)
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .DecimalStyle
testLabel.text = numberFormatter.stringFromNumber(answerCal)
}
}

任何帮助将不胜感激。

【问题讨论】:

  • 你到底想做什么?我不确定我是否理解,但我会尽力帮助您。
  • 标签 (testLabel.text)。在最后一行中,当它从 2 个文本字段中获得答案时,将打印为可选的,如 Optional("6")。我希望 testLabel.text 最后是 Double 而不是可选的(因为当它是可选的时,如果标签超过 1000,公式会崩溃,并且我正在处理大数字。谢谢。

标签: swift2 optional unwrap


【解决方案1】:

首先,很抱歉,因为我已将其放在平板电脑上,这意味着我无法访问代码编辑器。但是,这是我对您的问题的看法:

@IBOutlet weak var testLabel: UILabel!
@IBOutlet weak var first: UITextField!
@IBOutlet weak var second: UITextField!

func calculation1() -> Void {
    // Check our two text fields contain text
    guard let _ = first.text,
          let _ = second.text else { return }
  c // Check that the text can be parsed as Doubles
  c guard let dfirst : Double = Double(first.text!),
    let dsecond : Double = Double(second.text!) else { return }

    // Now that we know we have two valid numbers, do the calculation
    let answerCal : Double = ceil(dfirst! * dsecond!)

    // Fetch a number formatter
    let numberFormatter : NSNumberFormatter = {
        let nF : NSNumberFormatter = NSNumberFormatter()
        nF.numberStyle = .DecimalStyle
        return nF
    }()
    // And update the text field with the answer if it produces a valid result
    if let answerText : String =     numberFormatter.stringFromNumber(answerCal) {
         testLabel.text = answerText
    }
}

您必须小心使用 UI 元素,如果您不先检查,用户理论上可以输入任何内容并导致您的应用程序崩溃。因此,如果文本字段中没有文本或这些字段包含不可用的文本,则保护语句将安全地退出方法调用。

您从数字格式化程序返回 Optional 的原因是因为无法保证格式化程序能够为您提供有效的字符串。因此,您会看到,在尝试更新文本字段之前,我已经明确检查了 numbe 格式化程序是否会生成非零结果。

(注意 - 我很欣赏数字格式化程序的关闭在技术上超出了要求,但我发现有时在配置对象时更清楚。)

更新:

Vidal - 你试过我发给你的代码了吗?我很快就根据我昨晚整理的内容整理了以下内容。这显然很粗糙,但表明我建议的方法效果很好,除非我遗漏了什么。我能想到的唯一问题是您在界面构建器中做了一些我不知道的事情。希望对您有所帮助!

import UIKit

class ViewController: UIViewController {

    var calculatorView : UIView!
    var textFieldOne : UITextField!
    var textFieldTwo : UITextField!
    var calButton : UIButton!
    var answer : UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.calculatorView = {
                let cV : UIView = UIView(frame: CGRect(origin: CGPointZero, size: CGSizeMake(400, 400)))
            cV.backgroundColor = UIColor.redColor()

            func buildTextField() -> UITextField {
                let tF : UITextField = UITextField()
                tF.backgroundColor = UIColor.whiteColor()
                tF.textColor = UIColor.blackColor()
                tF.placeholder = "Please enter number"
                return tF
            }

            self.textFieldOne = buildTextField()
            self.textFieldTwo = buildTextField()
            self.textFieldOne.frame = CGRect(origin: CGPointMake(20, 20), size: CGSizeMake(160, 50))
            self.textFieldTwo.frame = CGRect(origin: CGPointMake(220, 20), size: CGSizeMake(160, 50))

            self.calButton = {
                let cB : UIButton = UIButton()
                cB.setTitle("Calculate", forState: .Normal)
                cB.frame = CGRect(origin: CGPointMake(20, 80), size: CGSizeMake(360, 50))
                cB.addTarget(self, action: #selector(self.getAnswer), forControlEvents: UIControlEvents.TouchUpInside)
                return cB
            }()

            self.answer = {
                let a : UILabel = UILabel()
                a.backgroundColor = UIColor.blueColor()
                a.textColor = UIColor.whiteColor()
                a.frame = CGRect(origin: CGPointMake(20, 140), size: CGSizeMake(360, 50))
                return a
            }()

            cV.addSubview(textFieldOne)
            cV.addSubview(textFieldTwo)
            cV.addSubview(calButton)
            cV.addSubview(answer)

            return cV
        }()

        self.view.addSubview(calculatorView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func getAnswer() -> Void {
        // Check our two text fields contain text
        guard let _ = self.textFieldOne.text,
              let _ = self.textFieldTwo.text else { return }
        // Check that the text can be parsed as Doubles
        guard let dfirst : Double = Double(self.textFieldOne.text!),
              let dsecond : Double = Double(self.textFieldTwo.text!) else { return }

        // Now that we know we have two valid numbers, do the calculation
        let answerCal : Double = ceil(dfirst * dsecond)

        // Fetch a number formatter
        let numberFormatter : NSNumberFormatter = {
            let nF : NSNumberFormatter = NSNumberFormatter()
            nF.numberStyle = .DecimalStyle
            return nF
        }()
        // And update the text field with the answer if it produces a valid result
        if let answerText : String = numberFormatter.stringFromNumber(answerCal) {
            self.answer.text = answerText
        }
    }
}

【讨论】:

  • 我正在使用只有数字和“.”的自定义键盘。 .我想得到 testlabel.text 的答案,并在另一个函数中使用它。例如如果 testlabel.text 是“1200”,我想要“1200 x 3%”。但是编译器告诉我 testlabel.text 是双精度的。谢谢。
  • 好的,在最后一行(“self.answer.text = answerText”)。这会将标签链接到字符串。但是假设我想创建一个新的函数并取“答案”作为标签并做一个额外的乘法,程序是什么?为什么我被卡住了,,标签是可选的,它不能很好地与另一个具有双精度或字符串的函数配合使用(即使我执行“let doubleConvert = Double(answer)”它也会出错。谢谢。
  • 好的,我让它工作 let percent3:Double = 1.03 @IBAction func threePercent(sender: AnyObject) { if let cost = Double(testLabel.text!) { let stringConv = "(cost) " var doubleValueFromString = Double((stringConv as NSString).doubleValue) doubleValueFromString = doubleValueFromString * percent3 let DoubleToString = "(doubleValueFromString)" testLabel.text = DoubleToString } else { print("不是一个有效的数字:(testLabel.text!)" ) } }
  • 文本没有显示为代码,但基本上我必须先将 label.text 设置为双精度,然后将其转换为字符串,然后使用 Double((stringConv as NSString) .doubleValue) 这会将字符串转换回双精度,然后我进行乘法运算,然后当我得到答案时,我将其转换回字符串,然后将其添加到 label.text 中。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多