Использование withMemoryRebound с Apples Swift 3 beta 6

У меня есть следующая проблема. Я хочу преобразовать мою старую функцию (работала до Swift 3 beta 5):

func binarytotype <T> (_ value: [UInt8], _: T.Type) -> T
{
    return value.withUnsafeBufferPointer
    {
        return UnsafePointer<T>($0.baseAddress!).pointee
    }
}

Свифт 3 бета 6 Синтаксис. Эта функция преобразует массив UInt8 в другой тип, например:

let b: [UInt8] = [1,2,3,4,5,6,7,8]
var number: Double = binarytotype(b, Double.self)

Но на данный момент это не работает больше в бета-версии 6, и я должен использовать withMemoryRebound, но я действительно не знаю, как заставить его работать. Кто-нибудь может мне помочь?

Обратной функцией этого было:

func typetobinary <T> (_ value: T) -> [UInt8]
{
    var v: T = value
    return withUnsafePointer(to: &v)
    {
        Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>($0), count: MemoryLayout<T>.size))
    }
}

Это тоже больше не работает. Та же проблема. Оба необходимы для некоторых из моих проектов. Эта обратная функция была названа как:

var binary: [UInt8] = typetobinary(number)

1 ответ

Решение

Преобразования указателей теперь намного более "многословны", начиная с Xcode 8 beta 6. Вот возможное решение:

func binarytotype <T> (_ value: [UInt8], _: T.Type) -> T {
    return value.withUnsafeBufferPointer {
        UnsafeRawPointer($0.baseAddress!).load(as: T.self)
    }
}

func typetobinary<T>(_ value: T) -> [UInt8] {
    var data = [UInt8](repeating: 0, count: MemoryLayout<T>.size)
    data.withUnsafeMutableBufferPointer {
        UnsafeMutableRawPointer($0.baseAddress!).storeBytes(of: value, as: T.self)
    }
    return data
}

Пример:

let d = typetobinary(UInt16(1000))
print(d) // [232, 3]
let i = binarytotype(d, UInt16.self)
print(i) // 1000

См. SE-0107 UnsafeRawPointer API для получения подробной информации о новом необработанном API указателя.

Другие вопросы по тегам