我有以下游乐场代码:
// Playground - noun: a place where people can play
import Cocoa
extension Array {
func toHexString<CUnsignedChar>() -> String {
var returnString = NSMutableString(capacity: self.count * 2)
for i in self {
let val = i as Int // if someone would like to answer why casting this as a CUnsignedChar throws an error, I'd appreciate it -- but that's a separate question
returnString.appendFormat("%02X", val)
}
return returnString
}
}
var hashedString: String? {
get {
let x: CUnsignedChar[] = [0xA, 0xB, 0xC]
return x.toHexString()
}
}
println(hashedString)
这会导致错误,&#34; NSString不是&#39; String&#39;&#34;&#34;
的子类型但是,如果我将此代码重写为:
var hashedString: String? {
get {
let x: CUnsignedChar[] = [0xA, 0xB, 0xC]
var returnString = NSMutableString(capacity: x.count * 2)
for i in x {
returnString.appendFormat("%02X", i)
}
return returnString
}
}
println(hashedString)
我没有错误。
答案 0 :(得分:2)
我会推荐一些事情。
首先,对于一个字节数组,使用UInt8
而不是CUnsignedChar
。此外,我将远离NSMutableString
并使用标准字符串连接和插值通过Swift。我试图在Swift中使用CVarArgs
并没有太大的成功。
这是我的实施:
extension Array
{
func toHexString() -> String
{
var hexString = ""
for value in self
{
if let integerValue = value as? UInt8
{
let stringValue = String(integerValue, radix: 16)
if integerValue < 0x10
{ hexString += "0\(stringValue)" }
else
{ hexString += stringValue }
}
}
return hexString;
}
}
let arrayOfBytes : Array<UInt8> = [ 0x0A, 0x13, 0x02, 0x2F, 0x22, 0x7A, 0xF1 ]
let hash = arrayOfBytes.toHexString()
let hashUppercase = hash.uppercaseString
很遗憾,您无法仅为extension
创建Array<UInt8>
并且必须扩展所有Arrays
,即使您的方法仅对一种类型有效。
答案 1 :(得分:0)
我认为这与您的扩展程序不返回可选项这一事实有关,但是您的hashedString会返回。
然而,当我试图弄乱上面的代码时,游乐场就像疯了一样崩溃。 =)