为什么我的扩展方法会导致类型错误?

时间:2014-06-05 01:59:17

标签: cocoa swift

我有以下游乐场代码:

// 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)

我没有错误。

2 个答案:

答案 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会返回。

然而,当我试图弄乱上面的代码时,游乐场就像疯了一样崩溃。 =)