[swift-users] When does `Data.init?(capacity:)` fail?

Adrian Zubarev adrian.zubarev at devandartist.com
Sun Jun 19 12:53:24 CDT 2016


I’ve got an answer on Twitter for that behavior: https://twitter.com/phausler/status/743927492096851969

I’ve anyone like me needs Data to have a specific capacity and still be non-optional, here is how I build a workaround (Data and Data.Deallocator aren’t fully implemented yet, thats why I’m using a custom deallocator rather then .free):

let capacity = 42 // or get the value somehow

let dataBufferPointer = UnsafeMutablePointer<UInt8>(allocatingCapacity: capacity)
        dataBufferPointer.initialize(with: 0, count: capacity)
         
// do some work and mutation to the data here

let deallocator = Data.Deallocator.custom {
             
    (buffer, _) in
             
    free(buffer)
}
         
// this initializer says you should not mutate that data after constructing it
let data = Data(bytesNoCopy: dataBufferPointer, count: capacity, deallocator: deallocator)



-- 
Adrian Zubarev
Sent with Airmail

Am 19. Juni 2016 um 19:27:21, Saagar Jha (saagarjha28 at gmail.com) schrieb:

Not quite:

Swift’s policy on memory allocation failure is that fixed-size object allocation is considered to be a runtime failure if it cannot be handled. OTOH, APIs that can take a variable and arbitrarily large amount to allocate should be failable. NSData falls into the later category. 
Source



On Sun, Jun 19, 2016 at 10:00 AM Karl <razielim at gmail.com> wrote:
As I understand it, that’s not an error in the ‘try’ sense of the word. If that failure happens, it’s a catastrophic issue which should bring down the application.

So the initialiser shouldn’t be failable; you’re right. File a bug at bugs.swift.org.

Karl

On 18 Jun 2016, at 06:06, Saagar Jha via swift-users <swift-users at swift.org> wrote:

This might be relavant. Basically, Data’s init will fail if memory can’t be allocated for it.



On Fri, Jun 17, 2016 at 11:38 AM Adrian Zubarev via swift-users <swift-users at swift.org> wrote:
Hello there, I’m trying to optimize my code and reduce copying from different buffers into a new one.

I thought I just create a Data value with enough capacity and write directly into it. My problem is that Data.init?(capacity:) can fail, but why and when?

Can someone explain this behavior to me?

I’m sending data via TCP sockets and when recn function write directly into a Data struct.




-- 
Adrian Zubarev
Sent with Airmail

_______________________________________________
swift-users mailing list
swift-users at swift.org
https://lists.swift.org/mailman/listinfo/swift-users
--
-Saagar Jha
_______________________________________________
swift-users mailing list
swift-users at swift.org
https://lists.swift.org/mailman/listinfo/swift-users

--
-Saagar Jha
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160619/ede94d7d/attachment.html>


More information about the swift-users mailing list