试图将十六进制文本转换为十进制的 swift ,但是得到"Optional([num])"输出

标签: UITextView ios Swift
发布时间: 2017/3/6 23:37:34
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图将十六进制数转换为十进制数。用户输入一个十六进制在 textview 中的,在文本编辑操作十进制 textview 输出转换。我正在奇怪的行为在十进制 textview 显示"可选 [num]"即"Optional(9) 如果我键入在 9。这里是十六进制文本操作侦听程序︰

@IBAction func inputHex(sender: AnyObject) {
        if(Int(hexText.text!) != nil){
            inputNumberText = hexText.text!

            let st3 = Int(inputNumberText, radix: 16)
            decText.text = String(st3)
        }
    }

解决方法 1:

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) 是字符串"Optional(...)"。

但请注意,有更多的问题,与您的代码︰

  • 不要使用 AnyObject 操作方法中的参数。始终使用真正的类型 (在这种情况下︰ UITextField ) 为更好的类型检查。 Xcode 有一个选项,当您连接的操作。
  • 永远不会有力地展开。使用可选绑定相反。
  • 比较 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 块。

官方微信
官方QQ群
31647020