2016-09-28 15 views
16

Tôi có một lớp xác nhận biên nhận không được chấp nhận vì Swift 3 đã phát hành. Tôi cố định một số vấn đề, nhưng tôi vẫn có nhiều ...UnsafePointer <UInt8> initializer trong Swift 3

Đây là mã nguồn GitHub tôi đã sử dụng: https://gist.github.com/baileysh9/4386ea92b047d97c7285#file-parsing_productids-swifthttps://gist.github.com/baileysh9/eddcba49d544635b3cf5

  1. Đầu tiên Lỗi:

    var p = UnsafePointer<UInt8>(data.bytes) 
    

Compiler ném: Không thể gọi trình khởi tạo cho loại UnsafePointer (UInt8) với danh sách đối số của loại UnsafeRawPointer

.210
  1. lỗi Second

    while (ptr < end) 
    

khai thác Binary < không thể được áp dụng cho hai UnsafePointer (uint8) toán hạng

Cảm ơn bạn rất nhiều trước:)

EDIT

Nhờ câu trả lời của LinShiwei tôi đã tìm thấy một giải pháp để khai báo UnsafePointer. Nó biên dịch nhưng chưa được thử nghiệm chưa (vì các lỗi khác tránh tôi để kiểm tra):

func getProductIdFromReceipt(_ data:Data) -> String? 
{ 
    let tempData: NSMutableData = NSMutableData(length: 26)! 
    data.withUnsafeBytes { 
     tempData.replaceBytes(in: NSMakeRange(0, data.count), withBytes: $0) 
    } 

    var p: UnsafePointer? = tempData.bytes.assumingMemoryBound(to: UInt8.self) 

Trả lời

27
  1. Trong Swift 3, bạn không thể init một UnsafePointer sử dụng một UnsafeRawPointer.

    Bạn có thể sử dụng assumingMemoryBound(to:) để chuyển đổi UnsafeRawPointer thành UnsafePointer<T>. Như thế này:

    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self) 
    
  2. Sử dụng debugDescription hoặc distance(to:) để so sánh hai con trỏ.

    while(ptr.debugDescription < endPtr.debugDescription) 
    

    hoặc

    while(ptr.distance(to:endPtr) > 0) 
    
+0

Được rồi cảm ơn bạn, điều này đã giúp :)! Tôi chỉnh sửa câu hỏi của mình để thêm mã mới vì nó phức tạp hơn một chút – GrayFox

+0

@GrayFox Sự cố là gì? – LinShiwei

+0

data.bytes.assumingMemoryBound (tới: UInt8.self) không hoạt động vì 'byte' ném lỗi trình biên dịch: "cần sử dụng UnsafeBytes thay vì byte". Tôi đã thêm toàn bộ khối vào phần EDIT;). Bây giờ, điều này làm việc nhưng tôi có lỗi mới khác trong device.identifierForVendor.getBytes (UnsafeMutablePointer (mutableData !.mutableBytes)) là: "Không thể gọi init kiểu UnsafeMutablePointer với danh sách đối số kiểu UnsafeMutableRawPointer" .... – GrayFox

-1

Có thể gần đây đã thay đổi để chỉ này, nếu không có sự ".bytes." phần:

var p: UnsafePointer = data.assumingMemoryBound(to: UInt8.self) 

từ bản gốc:

var p = UnsafePointer<UInt8>(data.bytes) 
Các vấn đề liên quan