尝试在 swift 中将十六进制文本转换为小数,但得到"可选([num])"输出



我正在尝试将十六进制数转换为十进制数。用户在文本视图中输入十六进制,在文本编辑操作中,十进制文本视图输出转换。我遇到一种奇怪的行为,如果我输入 9,十进制文本视图显示"可选[num]"IE"可选(9)。下面是十六进制文本操作侦听器:

@IBAction func inputHex(sender: AnyObject) {
        if(Int(hexText.text!) != nil){
            inputNumberText = hexText.text!
            let st3 = Int(inputNumberText, radix: 16)
            decText.text = String(st3)
        }
    }
let st3 = Int(inputNumberText, radix: 16)

调用"可失败的初始值设定项"

init?(_ text: String, radix radix: Int = default)

struct Int,这是失败的,这是有充分理由的:它返回nil如果字符串不是给定基数中的有效数字表示形式。例如

Int("12XYZ", radix: 16)
Int("789", radix: 8)

会返回nil.所以st3是可选的,因此String(st3)是字符串"可选(...)"。

但请注意,您的代码还有更多问题:

  • 不要在操作方法中使用AnyObject参数。始终使用实际类型(在本例中:UITextField)以获得更好的类型检查。Xcode 在连接操作时有一个选项。
  • 切勿用力打开包装。请改用可选绑定。
  • nil进行比较几乎可以而且应该避免例。

关于最后两点,比较何时应将可选值与 nil 进行比较?。

在您的情况下

if (Int(hexText.text!) != nil)

甚至是错误的,因为它拒绝有效的十六进制字符串,如"ABCD"。

您的操作方法如下所示:

@IBAction func inputHex(sender: UITextField) {
    if let text = sender.text,
        let number = Int(text, radix: 16) {
        decText.text = String(number)
    }
}

let text = ...let number = ...都是可选绑定在 if 语句的上下文中,并且 if 块仅执行如果两个绑定都成功。

最新更新