首页 > 解决方案 > 可以使用循环计算变量的 Swift 扩展?

问题描述

我想在 Swift 中“漂亮地打印”一个整数数组作为十六进制。我将以下内容作为 Array 的扩展工作。但我只能找到一种方法arr.toHex()来工作,而不是arr.toHex像我想做的那样。我想知道这是否可能。

其次,实际上我想以arr as Hex某种方式定义和定义 Hex。但不知道怎么做。

第三,在我的工作示例中,我需要强制转换为 Int 才能使其正常工作。但有时它会是一个Array(Uint8),而这个铸造不起作用。我应该使用可选的吗?

我正在使用最新的 Swift。

let arr = [255, 255, 128, 64, 16]

extension Array {
    func asHex() -> String {
        var res = "0x"
        for el in self {
            res.append(String(format:"%02X", el as! Int) + " ")
        }
        return res
    }
}

print(arr.asHex())
// output: 0xFF FF 80 40 10

// would wonder whether the looping function could make into a calculated variable like this:
print(arr.asHex)
// should generate same output

// and ultimately:
print(arr as Hex)
// I have no idea how to do this

更新:

结合我非常接近的答案,但我无法按照我的计划让它在一个“一个班轮”中[Int]工作。[UInt8]我这样做是为了满足这两种类型(比如Element in [Int, UInt8]

extension Array where Element == Int {
    var asHex: String { "0x" + self.map { String(format: "%02X", $0) }.joined(separator: " ")
    }
}
extension Array where Element == UInt8 {
    var asHex: String { "0x" + self.map { String(format: "%02X", $0) }.joined(separator: " ")
    }
}
print( [Int(12), Int(255)].asHex )       //0x0C FF
print( [UInt8(12), UInt8(255)].asHex )   //0x0C FF

我现在明白Intand UInt8are BinaryIntegers 并且$0字符串的格式是 a CVarArgextension Array where Element: BinaryInteger出于这个原因,自从$0投诉以来我无法使用。不过一定有办法。如此接近(并且学到了很多东西)

标签: arraysswift

解决方案


要将您的函数转换为计算属性,请使用以下命令:

extension Array where Element == Int {
    var asHex: String {
        return self.map { String(format: "%02X", $0) }.joined(separator: " ")
    }
}

不要追求arr as Hex路线,铸造不是解决这个问题的正确工具。


推荐阅读