Я пытаюсь написать расширение для Data, которое позволяет мне извлекать его в различных приведениях.
У меня странная проблема, которую я не могу понять.
Прежде чем приступить к обобщению, я пробую фиксированные типы данных и создал этот метод:
func intValueFromData(_ inData: Data) -> Int64? {
var number = Int64(0)
let len = Swift.min(MemoryLayout<Int64>.size, inData.count)
_ = withUnsafeMutableBytes(of: &number) {
inData.copyBytes(to: $0, from: 0..<len)
}
return number
}
Это работает. Если я сделаю это:
var int_64 = Int64(12345)
var data = Data(bytes: &int_64, count: MemoryLayout<Int64>.size)
let fetched = intValueFromData(data)
извлечено становится "12345" как Int64.
Однако, когда я пытаюсь внедрить тот же метод в тип данных, например, так:
extension Data {
mutating func intValueFromData() -> Int64? {
var number = Int64(0)
let len = Swift.min(MemoryLayout<Int64>.size, self.count)
_ = withUnsafeMutableBytes(of: &number) {
self.copyBytes(to: $0, from: 0..<len)
}
return number
}
}
Я получаю ошибку во время компиляции, которая говорит, что «withUnsafeMutableBytes(of: &number)
» не должен иметь аргумента.
В последний раз, когда я сталкивался с чем-то подобным, оказалось, что Apple явно заблокировал функциональность, но забыл сообщить нам об этом прямо.
Я не эксперт в такого рода вещах, но мне интересно, если кто-нибудь мог бы пролить свет на то, почему withUnsafeMutableBytes(of: &number)
ведет себя по-другому внутри расширение.