关于您的代码的几件事:
var charArray = [Character]()
charArray = map(hexArray) { charArray.append(Character($0)) }
您不需要创建数组然后分配映射的结果,您可以只分配结果,避免创建不必要的数组。
charArray = map(hexArray) { charArray.append(Character($0)) }
在这里您可以使用hexArray.map 而不是map(hexArray),当您使用映射函数时,您在概念上所做的是将接收器数组的元素映射到一组新值,映射的结果是新的“映射”数组,这意味着您不需要在 map 闭包内执行 charArray.append。
无论如何,这是一个工作示例:
let hexArray = ["2F", "24", "40", "2A"]
var charArray = hexArray.map { char -> Character in
let code = Int(strtoul(char, nil, 16))
return Character(UnicodeScalar(code))
}
println(charArray) // -> [/, $, @, *]
编辑:这是另一个不需要 Foundation 的实现:
func hexToScalar(char: String) -> UnicodeScalar {
var total = 0
for scalar in char.uppercaseString.unicodeScalars {
if !(scalar >= "A" && scalar <= "F" || scalar >= "0" && scalar <= "9") {
assertionFailure("Input is wrong")
}
if scalar >= "A" {
total = 16 * total + 10 + scalar.value - 65 /* 'A' */
} else {
total = 16 * total + scalar.value - 48 /* '0' */
}
}
return UnicodeScalar(total)
}
let hexArray = ["2F", "24", "40", "2A"]
var charArray = hexArray.map { Character(hexToScalar($0)) }
println(charArray)
EDIT2 还有一个选择:
func hexToScalar(char: String) -> UnicodeScalar {
let map = [ "0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9,
"A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15 ]
let total = reduce(char.uppercaseString.unicodeScalars, 0, { $0 * 16 + (map[String($1)] ?? 0xff) })
if total > 0xFF {
assertionFailure("Input char was wrong")
}
return UnicodeScalar(total)
}
最终编辑:解释
鉴于 ascii 表包含所有数字 (012345679),我们可以将 'N'(以 10 为底)转换为知道 ascii 值为 0 的整数。
因为:
'0': 48
'1': 49
...
'9': 57
然后,例如,如果您需要将“9”转换为 9,您可以这样做
asciiValue('9') - asciiValue('0') => 57 - 48 = 9
你可以从“A”到“F”做同样的事情:
'A': 65
'B': 66
...
'F': 70
现在我们可以像以前一样做,但是,例如对于“F”,我们会这样做:
asciiValue('F') - asciiValue('A') => 70 - 65 = 5
请注意,我们需要在这个数字上加上 10 才能得到小数点。然后(回到代码):如果标量在 A-Z 之间,我们需要这样做:
10 + asciiValue(<letter>) - asciiValue('A')
等同于:10 + scalar.value - 65
如果它在 0-9 之间:
asciiValue(<letter>) - asciiValue('0')
等同于:scalar.value - 48
例如:'2F'
'2' 是 2 而 'F' 是 15(由前面的例子),对吧?由于十六进制是以 16 为基数,我们需要这样做:
((16 ^ 1) * 2) + ((16 ^ 0) * 15) = 47