我正在尝试将十六进制数转换为十进制数。用户在文本视图中输入十六进制,在文本编辑操作中,十进制文本视图输出转换。我遇到一种奇怪的行为,如果我输入 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 块仅执行如果两个绑定都成功。