2016-09-17 20 views
6

tôi có mã nàyChuyển đổi UnsafeMutableRawPointer để UnsafeMutablePointer <T> trong nhanh chóng 3

let grayData = UnsafeMutablePointer<UInt8>(other: malloc(width * height * sizeof(UInt8))) 

Mà không biên dịch trong Swift 3. Làm thế nào để sửa lỗi này?

+0

Con trỏ thô của bạn ở đâu? Có vẻ như bạn phải khởi tạo một 'UnsafeMutablePointer ' của một kích thước nhất định –

+0

Lỗi của tôi, 'UInt8', không phải' UInt32' –

Trả lời

7

Trong trường hợp của bạn, bạn muốn sử dụng tốt hơn allocate(capacity:) phương pháp.

let grayData = UnsafeMutablePointer<UInt8>.allocate(capacity: width * height) 
1

Tìm thấy nó

let grayData = malloc(width * height * MemoryLayout<UInt8>.size)!.assumingMemoryBound(to: UInt8.self) 
24

Tôi gặp sự cố tương tự nhưng không liên quan gì đến malloc. Nếu mã của bạn cần xử lý thư viện C với Swift 3, bạn phải xử lý void * tương đương với UnsafeMutableRawPointer trong Swift 3. Mã của bạn cần xử lý nó như một cấu trúc nhất định. Nhưng bằng cách nào đó, nhanh chóng 3 trình biên dịch đang được cứng trên tôi để đúc. Tôi đã dành chút thời gian để tìm ra nó, và tôi muốn chia sẻ mã của tôi như thế nào để làm điều đó.

Đây là mã để chứng minh việc đúc UnsafeMutableRawPointer đến UnsafeMutablePointer<T>, sửa đổi điểm đánh dấu của nó và đảm bảo rằng bản gốc Context được cập nhật.

struct Context { 
    var city = "Tokyo" 
} 

var context: Context = Context() 
let rawPtr = UnsafeMutableRawPointer(&context) 
let opaquePtr = OpaquePointer(rawPtr) 
let contextPtr = UnsafeMutablePointer<Context>(opaquePtr) 

context.city // "Tokyo" 
contextPtr.pointee.city = "New York" 
context.city // "New York" 
0

Cảm ơn bạn đã trả lời câu hỏi trên. Nếu cần sử dụng calloc(), hãy xem:

let imageData = calloc(width * height, MemoryLayout<UInt32>.size).assumingMemoryBound(to: UInt32.self) 

Điều tôi thấy là tôi cần sử dụng "calloc" trong ứng dụng đồ họa để tải bitmap. Những gì tôi thấy là nếu malloc hoặc Swift phân bổ (dung lượng :) đã được sử dụng, rằng việc phân bổ có rác ngẫu nhiên (như người ta có thể mong đợi). Nếu điều này đã được sử dụng như là điểm khởi đầu để có được một bitmap của một hình ảnh, bạn sẽ thấy rác ngẫu nhiên trong mô phỏng nếu nền của hình ảnh rõ ràng. Thiết bị thực có vẻ rõ ràng điều này khi vẽ hình ảnh, và trình mô phỏng xử lý nền tảng rõ ràng như là một no-op. Sau đó, bạn có thể làm cho tiện ích mở rộng UIImage sau để nhận bitmap (Swift 3.0):

extension UIImage { 

    func unSafeBitmapData() -> UnsafeMutablePointer<UInt32>? { 
     guard let cgImage = self.cgImage else { return nil } 

     let width = Int(self.size.width) 
     let height = Int(self.size.height) 
     let bitsPerComponent = 8 

     let bytesPerPixel = 4 
     let bytesPerRow = width * bytesPerPixel 
     let maxPix = width * height 

     let imageData = calloc(maxPix, MemoryLayout<UInt32>.size).assumingMemoryBound(to: UInt32.self) 
     let colorSpace = CGColorSpaceCreateDeviceRGB() 

     var bitmapInfo: UInt32 = CGBitmapInfo.byteOrder32Big.rawValue 
     bitmapInfo |= CGImageAlphaInfo.premultipliedLast.rawValue & CGBitmapInfo.alphaInfoMask.rawValue 
     guard let imageContext = CGContext(data: imageData, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo) else { return nil } 
     imageContext.draw(cgImage, in: CGRect(origin: CGPoint.zero, size: self.size)) 

     return imageData 
    } 

} 
Các vấn đề liên quan