一尘不染

Swift本机函数将数字作为十六进制字符串

swift

是否有任何(至少整数)数字以本机Swift方式在字符串中获取其十六进制表示形式?反之。它一定不能使用Foundation。例如,String类具有一个函数

func toInt() -> Int?

它将代表整数的字符串转换为其Int值。我正在寻找类似的东西,使用十六进制字符串。我知道这很容易实现,但是如果Swift已经有了,那就更好了。否则,如果您已经对String和Int进行了扩展以实现以下目的:

let anHex = "0xA0"
if let anInt = anHex.toInt() {
   println(anInt)               // prints 128
   println(anInt.toHexString()) // prints "0xA0"
}

我知道这不是火箭科学,但以防万一,请分享。

PS:这类似于这个问题,不同之处在于它与Foundation框架非常相关,而我没有在代码中使用它(也没有导入其他任何东西),现在我想将其保留在这样,也用于学习目的。


阅读 373

收藏
2020-07-07

共1个答案

一尘不染

Swift 2开始, 所有整数类型都有一个构造函数

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

这样就可以使用内置方法完成整数到十六进制字符串和十六进制字符串到整数的转换。例:

let num = 1000
let str = String(num, radix: 16)
print(str) // "3e8"

if let num2 = Int(str, radix: 16) {
    print(num2) // 1000
}

(Swift 1的旧答案) 可以使用以下方法完成从整数到十六进制字符串的转换

let hex = String(num, radix: 16)

(例如,参见如何在Swift中将十进制数转换为二进制?)。这不需要导入任何Framework,并且可以使用2到36之间的任何基数。

如果愿意,可以使用BSD库函数strtoul()(比较如何在Swift中将二进制转换为十进制?)来完成从十六进制字符串到整数的转换import Darwin

否则,据我所知,没有内置的Swift方法。这是一个扩展,可以根据给定的基数将字符串转换为数字:

extension UInt {
    init?(_ string: String, radix: UInt) {
        let digits = "0123456789abcdefghijklmnopqrstuvwxyz"
        var result = UInt(0)
        for digit in string.lowercaseString {
            if let range = digits.rangeOfString(String(digit)) {
                let val = UInt(distance(digits.startIndex, range.startIndex))
                if val >= radix {
                    return nil
                }
                result = result * radix + val
            } else {
                return nil
            }
        }
        self = result
    }
}

例:

let hexString = "A0"
if let num = UInt(hexString, radix: 16) {
    println(num)
} else {
    println("invalid input")
}
2020-07-07