将可选字符串展开到Int&将其设为非可选

时间:2017-08-16 03:13:28

标签: ios swift swift3

自从我在iOS中进行编码以来,已经很长时间了,我正在将旧应用程序升级到swift 3.我真的很难解决使用可选变量的一个问题。

我有一个可选的文本字段。我希望将它解包为非可选的 Int ,以便我可以在其他函数中使用它进行计算。

@IBOutlet weak var txtRuns: UITextField!

func sendScore()
{   
    let runs        = txtRuns.text!
    let overs       = txtOvers.text!
    let balls       = txtBalls.text!
    let wkts        = txtWkts.text!
    let target      = txtTarget.text!
    let totalOvers  = txtTotalOvers.text!

    let strData  = "S|R\(runs)" + getOptionalScoreData(
             runs: Int(runs),
             wkts: Int(wkts),
             overs: Int(overs),
             balls: Int(balls),
             target: Int(target),
             totalOvers: Int(totalOvers)
             )
}

func getOptionalScoreData(runs: Int, wkts: Int, overs: Int, balls: Int, target: Int, totalOvers: Int) -> String
{
    if ( runs == 0 ) {
        return  getCurrentRunRate(runs: runs)
    }

    return "";
}

正如您所看到的,我有很多函数要调用,我希望这个文本字段变成非可选的INT。

现在我尝试了几个我在这里阅读的选项,但错误信息只会改变。问题没有解决。

目前的错误是

 The value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?

请帮忙。 感谢

.................

请注意,我认为嵌套检查不是一个好主意,因为所有这些变量都是相互独立的。一个可以是零,但其他可以仍然通过和使用。

如果我像这样嵌套检查,则意味着如果运行为零,则不会传递任何其他值。

if let runs = txtRuns.text, let runsInInt = Int(runs) {
    if let overs = txtOvers.text, let oversInInt = Int(overs) {
        if let wkts = txtWkts.text, let wktsInInt = Int(wkts) {

            strData = "S|R\(runs)\(overs)\(wkts)" + getOptionalScoreData( runs: runsInInt, overs: oversInInt, wkts: wktsInInt)

}

2 个答案:

答案 0 :(得分:4)

如果您经常从UITextField获得Int的价值,则可以按如下方式添加扩展程序:

extension UITextField {
    var intValue: Int {
        get {
            if let text = self.text {
                return Int(text) ?? 0
            }
            return 0
        }
        set {
            self.text = String(newValue)
        }
    }
}

您也可以在viewcontroller中添加上面的私有扩展名。现在您可以将代码重写为:

func sendScore() {
    let strData  = "S|R\(txtRuns.intValue)\(overs.intValue)\(wkts.intValue)" + getOptionalScoreData(
        runs: txtRuns.intValue,
        wkts: wkts.intValue,
        overs: overs.intValue,
        balls: balls.intValue,
        target: target.intValue,
        totalOvers: totalOvers.intValue)
    )
}

答案 1 :(得分:0)

0调用Int的构造函数:

Int(runs)

因为public init?(_ text: String, radix: Int = default)String可能由于String而失败可能不是有效的整数。

你会如何处理它?<​​/ p>

您可以参考Sallu的评论。

  1. 用户Int,以确保!中的String绝对是有效整数或应用程序崩溃。
  2. UITextField

      如果runs: Int(runs)!中的??不是有效整数,则
    1. 用户String提供默认值。
    2. UITextField

      如果默认值为0