Функциональная версия Swift
Один вкладыш:
let hexString = UnsafeBufferPointer<UInt8>(start: UnsafePointer(data.bytes),
count: data.length).map { String(format: "%02x", $0) }.joinWithSeparator("")
Вот в многоразовой и самодокументируемой форме расширения:
extension NSData {
func base16EncodedString(uppercase uppercase: Bool = false) -> String {
let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes),
count: self.length)
let hexFormat = uppercase ? "X" : "x"
let formatString = "%02\(hexFormat)"
let bytesAsHexStrings = buffer.map {
String(format: formatString, $0)
}
return bytesAsHexStrings.joinWithSeparator("")
}
}
В качестве альтернативы, используйте reduce("", combine: +)
вместо joinWithSeparator("")
, чтобы ваши коллеги воспринимали его как функционального мастера.
Редактировать: Я изменил String ($ 0, radix: 16) на String (формат: "% 02x", $ 0), потому что однозначные числа должны иметь нулевой отступ
(я пока не знаю, как пометить вопрос как дубликат этого другого , поэтому я просто опубликовал свой ответ снова)